数据通讯拆分包算法
在设备的通讯过程中,可能存在数据很长,导致数据无法一次性发送,或者长数据发送会丢失,为了解决这一问题,自己用C语言实现的一个简单的拆分包算法:
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include<stdlib.h>
#define dataTotalLen 100
#define groupLen 7//拆分后一个数据包的长度
int main(void)
{
uint8_t buf[dataTotalLen];
uint16_t tt = 0;
uint8_t div_dataPackSegLen,rem_dataPackSegLen;
uint16_t datalen = sizeof(buf);
printf("datalen = %d\r\n",datalen);
for( tt = 1;tt <= datalen;tt++)//假设一个数据包有这么多的数据,根据datalen来判断
{
buf[tt-1] = tt;//填充数据
}
div_dataPackSegLen = datalen / groupLen;//数据包可以分为几个包上传
rem_dataPackSegLen = datalen % groupLen;//多余的数据与最后一个数据包合并再上传
printf("可以分成%d个数据包,最后一个数据包附加%d个数据一起上传!!!\r\n",div_dataPackSegLen,rem_dataPackSegLen);
for(tt = 0;tt < datalen - rem_dataPackSegLen;tt += groupLen)//对数据包进行
{
printf("tt=%d\r\n",tt);
if(tt == (div_dataPackSegLen * groupLen - groupLen))//数据包合并
{
for(uint8_t i = tt;i < tt + groupLen + rem_dataPackSegLen;i++)//拆包
{
printf("buf[%d]=%d \r\n",i,buf[i]);
}
}else{
for(uint8_t i = tt;i < tt+groupLen;i++)//拆包
{
printf("buf[%d]=%d \r\n",i,buf[i]);
}
}
}
return 0;
}
总结
- 上一篇: C#串口上位机软件--IOT串口调试精灵
- 下一篇: 单片机编程之联合体(union)的妙用