【Qt串口调试助手】1.2 - 串口数据接收不发生换行,CH340 / CP2102 多硬件兼容

 

上一篇提到:对串口接收的显示,使用的是当前位置插入+移动鼠标光标到末尾的方式。这种方法可以有效解决 串口数据接收发生换行的问题,并且解决 CH340 / CP2102 多硬件显示结果不一致的问题。那有没有别的方式?各有什么优劣?

GitHub源码下载:Qt串口调试助手下载

 

串口数据接收不发生换行,的几种解决方法:

  • 第1种:appendPlainText,末尾追加显示。会带来接收换行问题,并且 CH340 / CP2102 多硬件显示结果不一致。
  • 第3、4种都是将文本框内容全部读取再追加内容,最后再放回文本框,导致运行效率很低。而网上很多开源代码是使用的这种处理方式。这正是使我想要搭建自己开发框架的原因,追求可靠、高效。
  • 我在代码中,使用的是第2种处理方式。解决插入换行问题,并兼容 CH340、CP2102等不同设备。

1. appendPlainText 末尾追加,会发生换行

使用 appendPlainText 末尾追加,会使接收区发生换行,导致与发送区的数据不完全一致。

并且对于不同硬件的端口,如 CH340、CP2102,显示结果有很大差别。

  • 同样发送一段数据,观察 CH340、CP2102使用 appendPlainText 末尾追加 的显示效果:

电脑 COM8 的串口硬件为 CH340,COM9 的硬件为 CP2102,将 TX、RX短接,自发自收。

CP2102 的接收区现象:(会产生不正常换行)

CH340 的接收区现象:(无不正常换行)怀疑 CP2102 的USB上报率要高于 CH340。

继续将单次发送的字节数增大,CH340也同样会发生换行。所以排除硬件兼容问题,原因更像是电脑串口数据流的自身处理机制导致。故想要依靠更换端口硬件的方法,实现接收显示不换行并不现实,需要其他的显示处理方法。

2. insertPlainText 当前位置插入 + 移动光标到末尾,不发生换行

这种方式是我觉得最好的,解决了不正常换行问题,显示效率又比较高。

3. 获取显示区所有内容再末尾插入,不发生换行

这种方式,虽然也能解决插入换行问题,但随着接收显示区的缓存变大,处理效率一定会逐渐降低。不建议使用这种方法。

4.不换行造成的卡顿的解决办法

以上几种方法,除了append不会造成卡顿外,其他方式在接收区字节长度达到几万时,均会造成CPU占用率过高,软件运行严重卡顿的现象。

解决方法有以下几种:

(1)手动清空数据。当数据量累积到一定值的时候,人为地清空QTextEdit。

(2)手动添加换行。当数据量累积到一定值的时候,人为地向QTextEdit添加换行。

(3)限制QTextEdit地显示数量,只显示最近数据,超出后自动清除历史数据。

由于第(3)种方法比较麻烦,而第(1)种能显示的数据有限,所以我最后使用了第(2)种方式。

最终应用在了【Qt串口波形绘图】中,完全兼容【Qt串口调试助手】的所有功能,添加了更详细的统计显示和调试功能,可进行动态波形绘图。

【Qt串口波形绘图】:Qt串口波形绘图

5.提高通信波特率可以降低CPU占用率

实测,在相同数据量的情况下,提高串口通信波特率,可以有效降低CPU占用率:

  • 115200波特率,900Byte/s的通信速率。此时CPU占用4.7%。

  • 提高通信速率到11200Byte/s,使通信速率逼近当前物理上限,发现CPU使用率会飙升到30%多。可见高通信速率会引起软件高负荷,但实际测试这种情况并不会卡顿,因为接收区强制添加了换行。

(收发速率显示不一致,是因为接收区有缓存的存在,且Qt的串口触发机制中没有空闲信号,导致收发的字节信息一致,而帧数却不一致。计算速率时可能有数据还存在于接收缓存中没有读出来,导致接收区的速率计算有误差)

  • 来个对照组实验。同样的发送速率11200Byte/s,仅仅是将物理串口的波特率,从115200提高到921600,就可以将CPU占用率降低。

猜你喜欢

转载自blog.csdn.net/Mark_md/article/details/109044487