怎么样使用Qt编程实现串口接收不定长数据帧

C++语言 码拜 9年前 (2016-06-02) 5093次浏览
要接收像这样的不定长数据帧,该怎么实现,使用的是第三方Qextserialport类。
帧结构:
帧头1 (1byte)+ 帧头2(1byte) + 数据长度(1byte) + 数据(n byte) + 校验(1byte) + 帧尾1(1byte) + 帧尾2(1byte)
学习了下Qextserialport在Windows的例子,使用事件触发的方式,串口接收到数据就发出readyRead()信号(QIODevice类),触发与之连接的槽函数执行读取数据操作readAll(),保存到自定义的缓存中处理。但是本人发现readyRead信号不是每接收到一个字节就发出的,而是连续的一串数据或是几个数据之后。假如单片机向上位机发送数据的过程中,出现停顿,也就是一帧数据分几次传输这种情况,那readyread信号发出几次就无法知道。本人是用单片机编程的思路来想这个问题的,单片机串口接收只要有一字节的数据接收到,就会产生中断,在中断里就对数据进行判断,放入缓冲中相应的位置。说得好乱-_-||
在网上查资料和论坛,大致是一下的思路:
1.创建循环缓冲区;
2.串口readyRead信号发出后,就把数据读取到循环缓冲区,修改指针;
3.开一个线程,读循环缓冲区,查找帧头,若找到,则把一帧数据读出,修改指针,判断数据帧能否有效,并解析;
不知道行不行,求指点
解决方案

25

不定长,先读头,读到头后,判断长度,然后再一次性读取此长度的包。

15

应该是先读3个字节,包含头和长度n
然后再读n+3字节
当然后面应该加上校验

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样使用Qt编程实现串口接收不定长数据帧
喜欢 (1)
[1034331897@qq.com]
分享 (0)