找回密码
 立即注册
收起左侧

串口通信数据解析

7
回复
14433
查看
[复制链接]
累计签到:17 天
连续签到:1 天
来源: 2017-9-8 16:11:57 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-9-8 16:11:58 显示全部楼层
本帖最后由 angelus 于 2017-9-12 17:58 编辑

首先定义一个 私有 的QByteArray 存储每次读到的数据。
然后定义一个 私有 的QByteArray 存储你的头部内容,有些头部是两个 16 进制数据,比如 0A 05这样的。

第一步先把读到的数据缓存,然后根据头部大小,left几位,比较下头部,如果相等,就进行下一步,如果不相等就抛弃所有数据,不用担心头几次的数据错误,等几次交互后,就会正常,基本不会再出现错位丢包。

第二步是计算每一帧的大小,根据协议去计算,然后存储,一般都在第二位存储帧的大小
如果缓存的数据大于2位,就取出第二位的帧大小进行存储。

第三步是判断 缓存是否满足帧大小,如果不满足,就继续缓冲等待,满足就从缓存中取出帧,然后处理校验和
如果校验和OK,就继续处理,如果不OK,就丢弃帧。

note: 这个过程建议写成一个函数,因为可以会进行递归调用,缓存中可能会一次 存好几个帧,递归调用会进行依次处理!QByteArray存储的值意义很明显,Byte 形式的数组,一个byte是8位,换句话说就是8位的二进制,
一个byte转化为16进制最大为0xFF ,10进制最大值是255 , 计算机中都是数字的,你看到的文字,只是数字根据规则翻译过去的。
一串的byte其实就是 一串的 数字,根据ascii码,就可以翻译成 文字了。


需要注意的是,在传输中 经常会有两位 byte 组成一个数值,很明显 一个8位 不足以表达超过 255的值 ,这时候就需要注意看协议中的大小端了! 也就是高位8个二进制 和 低位8个二进制怎么组合。
比如 0x01 和 0x02  谁在前谁在后,数值是截然不同的, 一般组合都是 0x01是高位 0x02是低位!
回复

使用道具 举报

累计签到:77 天
连续签到:1 天
2017-9-9 16:05:25 显示全部楼层
每次ReadAll,追加到buffer中,找帧头,解析(buffer中可能有多个帧)。把已经解析的部分,从buffer中移除,继续读com。buffer中就是存放的二进制,或ASCII串,如果解析取决与你自己定义的格式协议。
回复

使用道具 举报

尚未签到

2017-9-11 10:05:46 显示全部楼层
buffer的数据就是你发送端的数据(字符、数字等),根据你发送端的格式解析就好。比如0xA5 + 数据 +0x05+数据+0x06+校验等,你发什么收到的就是什么。
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2017-9-11 23:12:33 显示全部楼层
首先,buffer[i]是二进制数据,根据楼主的描述,需要将其转换为16进制数,然后与0xa5,0x05进行比较,得到每一帧数据的开头。
总结:遍历buffer数组--找到数据帧标志位--处理每一帧数据--continue;
回复

使用道具 举报

累计签到:17 天
连续签到:1 天
2017-9-13 14:11:54 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

累计签到:53 天
连续签到:1 天
2017-9-13 17:24:48 显示全部楼层
newbe 发表于 2017-9-13 14:11
能找个串口解析的源码给我吗,最好带实时图像的,我邮箱,OK的话最佳答案就决定是你了! ...

有些坑你还是要自己踩比较好!
回复

使用道具 举报

累计签到:17 天
连续签到:1 天
2017-9-14 09:11:55 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了