概述
串口编程 - 通信协议解析
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
文章目录
- 串口编程 - 通信协议解析
- 前言
- 1. 解析通信协议流程
- 2. 伪代码
前言
规定了串口通信协议之后,接下来就是如何解析通信协议。
1. 解析通信协议流程
+--------------+
| |
| 收到数据 |
| |
+------+-------+
|
+------v-------+
| |
| 放入缓冲区 |
| |
+------+-------+
|
|
+------v-------+
| |
| 找到帧头 |
| |
+------+-------+
|
|
+------v-------+
| |
| 根据长度 |
| 提取数据 |
+------+-------+
|
|
+------v-------+
| |
| 校验数据 |
| 移除缓冲 |
+------+-------+
|
+------v-------+
| |
| 解析完成 |
| 通知上层 |
+--------------+
2. 伪代码
// 1. 接收的数据放到缓冲区
buffer.insert(commReceiveData);
// 2. 桢解析
/*
EB90 00 0007 20211025000000 7F52
帧头:0xEB90
版本: 0x00
数据长度:0x0007
数据:0x20211025000000
校验和(CRC-16/MODBUS(0x18005)):0x7F52
*/
while (buffer.length >= 7) // 缓冲区长度至少为7,包括帧头(2字节)+版本(1字节)+数据长度(2字节)+校验和(2字节)
{
//2.1 查找帧头
int headerIndex = buffer.find(0xEB); // 帧头第一个字符索引
if(headerIndex >= 0)
{
if ( buffer[headerIndex + 1] == 0x90) // 帧头第二个字符
{
// 2.2 判断数据长度
int len = buffer[headerIndex + 3] << 8 + buffer[headerIndex + 4]; // 获取数据长度
// 数据长度不足,则等待下一次判断
if (buffer.length < len + 5)
{
break;
}
else
{
// 2.3 计算校验码
string dataNeedCheck = buffer.substring(headerIndex,len + 5);
checkSum = checkSumFunction(dataNeedCheck); // 获取从帧头到校验和前的所有数据的校验码
dataCheckSum = buffer[headerIndex + len + 5] << 8 + buffer[headerIndex + len + 6]; // 获取缓冲区数据的校验吗
if(checkSum == dataCheckSum)
{
// 数据校验成功,提取数据通知同层业务
string dataFrame = buffer.substring(headerIndex,len + 7);
notify(dataFrame);
continue;
}
else
{
// 数据校验失败,继续下一次循环
continue;
}
}
}
else
{
// 帧头0xEB90判断失败,则继续寻找下一个0xEB
buffer = buffer.substring(2); // buffer指向后面的数据
continue;
}
}
}
License
License under CC BY-NC-ND 4.0: 署名-非商业使用-禁止演绎
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
Reference:
- NULL
最后
以上就是现实荷花为你收集整理的串口编程 - 通信协议解析串口编程 - 通信协议解析的全部内容,希望文章能够帮你解决串口编程 - 通信协议解析串口编程 - 通信协议解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复