-
modbus协议帧的完整性判断并解析,其中无线传感节点自动上报的数据结构为:
struct STR_JDWDSEND
{unsigned char nStart1; //0x09 1字节 unsigned char nStart2; //0xaf 1字节 unsigned char nOrder=2; //第二版温度 1字节 unsigned long int nID; //传感器编号 4字节 signed int nT; //读取的温度 2字节 signed int ntemp; //预留数据(序列号) 2字节 int nCrc; //CRC校验码 2字节 unsigned char nEnd; //0x16 1字节
};
下面是我自己写的相关的接收帧的代码:
//接收完整的帧
char get_complete_frame(int fd) {
char read_data[MAXSIZE]; //用来存放每一次读到的数据
char read_buf[32]; //用来存放一个完整的帧
char read_tmp[MAXSIZE] = { 0 };
int return_flag = 0;
int i;
while (1) {
memset(read_tmp, 0, sizeof(read_tmp));
if (read(fd, read_tmp, sizeof(read_tmp)) > 0) {
for (i = 0; i < strlen(read_tmp); i++) {
if (read_tmp[i] == 0x09 && read_tmp[i+1]==0xaf) { //判断帧头
memset(read_data, 0, sizeof(read_data));
char tmp[14] = { 0 };
tmp[0] = read_tmp[i];
tmp[1] = read_tmp[i + 1];
strcat(read_data, tmp);
}
else if (read_tmp[i] == 0x16)
{
char tmp[14] = { 0 };
tmp[0] = read_tmp[i];
strcat(read_data, tmp);
return_flag = 1;
memset(read_buf, 0, sizeof(read_buf));
//遇到帧尾,将read_data帧拷贝到read_buf中,以便处理
memcpy(read_buf, read_data, sizeof(read_data));
}
else {
char tmp[14] = { 0 };
tmp[0] = read_tmp[i];
strcat(read_data, tmp);
}
}
if (return_flag == 1) return read_buf;
else return 0;
sleep(5);
}
}
}
主要想问一下我怎样做到把接收到的一帧数据传输到read_buf中进行数据分析后,然后把得到的数据进行清除。
另外怎样根据主动上报的报文格式,根据长度和帧头,帧尾进行帧完整性的查询。
你的代码存在很多问题:
1.没有处理网络异常和读中断的问题
2.没有考虑网络字节序和本地字节的问题
3.没有考虑结构体内存对齐问题
解决方案:
1.处理好网络读写,实现一个健壮的网络读写函数
2.做好反序列化(网络字节->c结构体)
3.你这个协议是比较好解析的,因为协议数据的定长的
PS:协议解析什么的可以参考文章:https://segmentfault.com/a/11...