嵌入式开发中自定义协议的解析与组包
时间:2021-10-19 16:10:37
手机看文章
扫描二维码
随时随地手机看文章
[导读]在嵌入式产品开发中,经常会遇到两个设备之间的通信、设备与服务器的通信、设备和上位机的通信等,很多时候通信协议都是自定义的,所以就涉及到自定义协议的解析和组包问题。比如针对下面的这样一个协议:帧头1帧头2字段1字段2校验固定值:0x55固定值:0xAA设备ID电压值前面所有数据异或...
在嵌入式产品开发中,经常会遇到两个设备之间的通信、设备与服务器的通信、设备和上位机的通信等,很多时候通信协议都是自定义的,所以就涉及到自定义协议的解析和组包问题。比如针对下面的这样一个协议:
数据在发送时涉及到一个大小端的概念,大小端是针对多字节数据的传输,比如上述协议中字段1,假设两字节内容为0x0001,先发送0x01后发送0x00,称为小端模式;先发送0x00后发送0x01,称为大端模式。假设字段1内容为0x001,字段2内容为0x40533333 (对应为3.3)
假设按照小端方式发送,下面是帧数据:55 AA 01 00 33 33 53 40 ED下面来看看如何解析,若干年前,在第一次面对这种问题时,用的如下傻瓜式的代码方式实现:
帧头1 | 帧头2 | 字段1 | 字段2 | 校验 |
---|---|---|---|---|
固定值:0x55 | 固定值:0xAA | 设备ID | 电压值 | 前面所有数据异或值 |
char | char | short | float | char |
1字节 | 1字节 | 2字节 | 4字节 | 1字节 |
假设按照小端方式发送,下面是帧数据:55 AA 01 00 33 33 53 40 ED下面来看看如何解析,若干年前,在第一次面对这种问题时,用的如下傻瓜式的代码方式实现:
#include
int main()
{
unsigned char Rxbuf[9] = {0x55,0xAA,0x01,0x00,0x33,0x33,0x53,0x40,0xED};
short DeviceId;
float Voltage;
unsigned char check = 0;
int i;
for(i=0;i<8;i )
{
check ^= Rxbuf[i];
}
if(Rxbuf[0]==0x55