查看完整版本: [-- 老问题:串口接收数据(readall),,会换行问题,,希望大家都给点解决意见 --]

QTCN开发网 -> Qt嵌入式开发 -> 老问题:串口接收数据(readall),,会换行问题,,希望大家都给点解决意见 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

hello_树哥 2017-08-22 17:53

老问题:串口接收数据(readall),,会换行问题,,希望大家都给点解决意见

利用串口调试工具,跳线帽短接收发,实现通过软件界面的一个textedit发,,另一个textedit收,功能已经实现了,但是还有问题
问题:数据能完全读到,但是会出现换行,,网上的都说家read.waitreadyread()函数,或者sleep()函数,但是我都试过了,,没有解决这个问题,大家有什么更好的办法吗??或者是通过多个线程能解决吗??

hello_树哥 2017-08-22 18:02
就是假如我发送一串字符串“cbashcnklasnkc”,但是在接受端会出现数据不连续,,换行,而且每次换行的位置不一样,可能接受的是:
cbashcnkl
asnkc
这样的序列,也可能是
cb
ashcnklasnkc
这样的序列

lichen221334 2017-08-23 08:38
发送的时候 flush()一下,接收的时候 waitreadyread()

再不行就用处理网络的方式 来 接受信息,拼接信息直到满足条件或 超出可接受范围

liudianwu 2017-08-23 09:07
任何数据的接收肯定是不确定的,你可以将接收到的数据放入buffer,然后开个定时器从buffer中取出来判断是否完整,完整则解析。如果你想不要断行,你可以在接收数据前延时100毫秒试试。

nigoole 2017-08-23 09:26
延时问题应该能解决大部分时候,毕竟时间这个东西,大家都很难估摸,假如你知道接收数据的长度,可以用这个来进行处理,等串口buf的数据接收到某个长度的时候再读,如此往复。

hello_树哥 2017-08-23 10:16
liudianwu:任何数据的接收肯定是不确定的,你可以将接收到的数据放入buffer,然后开个定时器从buffer中取出来判断是否完整,完整则解析。如果你想不要断行,你可以在接收数据前延时100毫秒试试。 (2017-08-23 09:07) 

这里我将waitForReadyRead(10),函数换成sleep(10),在接受数据前加了一个sleep(10)毫秒级的函数确实能够读取,而且不换行,,但是又了新问题,貌似readyread信号发射了多次,,,本来就一行就完成了,这里出现了好多行,而且是不确定的,后面读到了的行是没有数据

hello_树哥 2017-08-23 10:17
@lichen221334   你采用这种办法解决了吗

查了下waitForReadyRead的用法:
此功能将阻塞,直到新数据可用于读取并且readyRead()信号已被发出。 该功能将在msecs毫秒后超时; 默认超时时间为30000毫秒。
如果发出readyRead()信号并且有新的数据可供读取,该函数将返回true; 否则返回false(如果发生错误或操作超时)。
亲自测过加上该函数,但是实际上比没有解决,,仍然换行,,,猜想应该是readyread信号发送过多次的原因,,正在测试中,,

lichen221334 2017-08-24 08:40
一般发送过多次 是不是你 on_pushButton_4_clicked 这个槽函数链接了 多次 可以check一下
存在换行check一下发送的数据,qDebug()<<S_data.toLatin1()
而且在接收时候也完全可以自己判断移除掉"\n"


如果依然存在接收不全,可以采用 处理网络信息的方式,如  liudianwu刘大师所说。

yuyu414 2017-08-25 08:24
接收到的数据存入缓存,根据通讯协议来解析,不要用延时

sunchenghao 2017-08-28 15:44
条线短路收发,有没有可能是收发的波特率不一样。

ketiy2004 2018-01-12 22:26
1、问题方向出错了,不是串口接收多了换行,而是显示问题!
2、串口接收因为收发异步问题,所以一行数据多次接收,这是正常现象。
3、判断收到的数据,是否包含换行字符,如果是显示的时候换行,如果没有,数据继续在该行尾部显示。


查看完整版本: [-- 老问题:串口接收数据(readall),,会换行问题,,希望大家都给点解决意见 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled