QT串口阻塞方式使用,关闭时怎么使其退出waitForReadyRead(-1)

lr2131 2019-06-24 10:09:51
在编程中,我对QT串口采用了阻塞的方式,开了一个子线程专门读取串口的数据,这样的话,有数据就读没有数据就睡眠的方式。
但是,却发现在关闭串口后,串口仍然在等待数据,子线程仍然睡在waitForReadyRead(-1)这里。
怎么样做,才能在需要关闭串口的时候,让waitForReadyRead(-1)退出?

...全文
2063 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lr2131 2019-06-26
  • 打赏
  • 举报
回复
引用 10 楼 走好每一步 的回复:
[quote=引用 9 楼 lr2131 的回复:]
[quote=引用 8 楼 走好每一步 的回复:]
waitForReadyRead
这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。
后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。


感谢提醒!
另外想问一下怎么找waitForReadyRead源码看,刚还找过没找到。看了QT Create帮助里的函数描述也确实看不出什么。

[/quote]

你安装QT的时候,需勾选source选项,用everything的高级搜索,可以选定QT源码目录里有QtSerialPort \src,很快可以找到该函数[/quote]

引用 11 楼 走好每一步 的回复:
QT源码你要注意,它是分接口类和私有数据类的,然后真正是实现功能的分windows版本和linux版本。


谢谢你,提供的经验和方法!
走好每一步 2019-06-24
  • 打赏
  • 举报
回复
QT源码你要注意,它是分接口类和私有数据类的,然后真正是实现功能的分windows版本和linux版本。
走好每一步 2019-06-24
  • 打赏
  • 举报
回复
引用 9 楼 lr2131 的回复:
[quote=引用 8 楼 走好每一步 的回复:]
waitForReadyRead
这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。
后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。


感谢提醒!
另外想问一下怎么找waitForReadyRead源码看,刚还找过没找到。看了QT Create帮助里的函数描述也确实看不出什么。

[/quote]

你安装QT的时候,需勾选source选项,用everything的高级搜索,可以选定QT源码目录里有QtSerialPort \src,很快可以找到该函数
lr2131 2019-06-24
  • 打赏
  • 举报
回复
引用 8 楼 走好每一步 的回复:
waitForReadyRead
这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。
后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。


感谢提醒!
另外想问一下怎么找waitForReadyRead源码看,刚还找过没找到。看了QT Create帮助里的函数描述也确实看不出什么。

走好每一步 2019-06-24
  • 打赏
  • 举报
回复
waitForReadyRead 这个函数名字取的不太恰当,之前我也一直以为是等待信号,会把线程挂起。 后面查了源码才知道是在一个死循环里不断地轮训读buf是否有新的数据进来,超时就跳出循环。
lr2131 2019-06-24
  • 打赏
  • 举报
回复
引用 4 楼 zhangxiuyuan 的回复:
3楼正解
waitForReadyRead(10);设置一个超时等待时间,如果没有串口数据导致超时退出,然后线程中继续下一次循环,可以在此时加入退出线程处理。
==============================
while(1)
{
//串口关闭的场合,线程退出
if(!serial_port_open)
{
break;
}

if(waitForReadyRead(10))
{
readall
}
else
{
sleep(10);
}
}
}



漏了
lr2131 2019-06-24
  • 打赏
  • 举报
回复
引用 3 楼 走好每一步 的回复:
纠正一下waitForReadyRead(-1),并不是睡眠,而是无限循环查看读buf有没有新的数据
没必要一直查的

ThreadFun{

if(waitForReadyRead(10)) {
readall
}
else{
sleep(10);
}

}





引用 3 楼 走好每一步 的回复:
纠正一下waitForReadyRead(-1),并不是睡眠,而是无限循环查看读buf有没有新的数据
没必要一直查的

ThreadFun{

if(waitForReadyRead(10)) {
readall
}
else{
sleep(10);
}

}


谢谢两位的回复!

之前粗略的看了下waitForReadyRead(),不知道waitForReadyRead()原来是内部查询方式,我得再看看。
如果是内部查询的话,倒有些违背我最开始的宗旨了,我就是想节省CPU的资源,不用轮询,又可以显式的线程处理才这么写代码的。




lr2131 2019-06-24
  • 打赏
  • 举报
回复
引用 1 楼 不易易 的回复:
1、改成异步read
2、可以试试socket 强制断开。 比如 soket.abort()


谢谢回复!

方法1当然是可以的,之前就是这么干的,用的那个串口的信号槽,在槽里面去读数据,当然这样也就不用专门开个线程。
不过就当做是学习吧,我很想换个方法试试。因为是从非GUI的领域转过来搞QT的,开个线程专门读取阻塞方式的串口并解析数据,代码已经非常成熟了。所以也想把QT上串口也做成之前那种。

方法2可以试试。

再次谢谢!
zhangxiuyuan 2019-06-24
  • 打赏
  • 举报
回复
3楼正解 waitForReadyRead(10);设置一个超时等待时间,如果没有串口数据导致超时退出,然后线程中继续下一次循环,可以在此时加入退出线程处理。 ============================== while(1) { //串口关闭的场合,线程退出 if(!serial_port_open) { break; } if(waitForReadyRead(10)) { readall } else { sleep(10); } } }
走好每一步 2019-06-24
  • 打赏
  • 举报
回复
纠正一下waitForReadyRead(-1),并不是睡眠,而是无限循环查看读buf有没有新的数据 没必要一直查的 ThreadFun{ if(waitForReadyRead(10)) { readall } else{ sleep(10); } }
走好每一步 2019-06-24
  • 打赏
  • 举报
回复
没有办法的,除非你开另外一个串口,给它发东西 你看下源码就知道了。 while (msecs == -1 || qt_subtract_from_timeout(msecs, stopWatch.elapsed()) > 0); 换成异步吧,或者不要waitForReadyRead(-1),你改成这样不好吗 Thread() waitForReadyRead(10); readAll
不易易 2019-06-24
  • 打赏
  • 举报
回复
1、改成异步read
2、可以试试socket 强制断开。 比如 soket.abort()

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧