C/C++ 协议解析通用流转包方法不怕连包

一、流程图

二、详细代码 

//begin解析数据包
static uint8_t parse_packet_buf[20480];
static int16_t parse_packet_buf_index = 0;
static uint8_t resolver_num_packets = 0;
static void add_parse_packet_buf(uint8_t* data, uint16_t len)
{
	if(len<(20480-parse_packet_buf_index))
	{
		memcpy(&parse_packet_buf[parse_packet_buf_index], data, len);
		parse_packet_buf_index+=len;
	}
}

static void delete_parse_packet_buf(uint16_t len)
{
	memcpy(parse_packet_buf, &parse_packet_buf[len], parse_packet_buf_index-len);
  parse_packet_buf_index-=len;
}
static uint16_t resolver_delete(uint8_t* buff)
{
  int16_t byte_count = 0;
  int16_t data_len = 0;
  uint8_t check_sum = 0;
  uint8_t recv_checksum = 0;
  if(parse_packet_buf_index<=5)
  {
    return byte_count;
  }
  if ((buff[0] == 0xAA) && (buff[1] == 0x55))
  {
    data_len = (buff[3] << 8) + buff[4];
    if ((data_len != 0) && (data_len < 1024))
    {
      recv_checksum = get_checksum(&buff[5], data_len);
      check_sum = buff[2];  
      byte_count = data_len + 5;
      if (recv_checksum == check_sum)
      {
		  resolver_num_packets++;
          printf("check succes\r\n");
      }
      else
      {
        //CheckSum错误
        //滑动丢弃无用字节
        byte_count = 1;
        printf("check err\r\n");
      }
    }
    else
    {
        //滑动丢弃无用字节
        byte_count = 1;
    }
  }
  return byte_count;
}

static uint8_t parse_packet(uint8_t* data, uint16_t len)
{
  uint16_t delete_len = 0;
  resolver_num_packets = 0;
  add_parse_packet_buf(data,len);
	
  while(1)
  {
    delete_len = resolver_delete(parse_packet_buf);
    if(delete_len == 0)
    {
      break;
    }
    else
    {
      delete_parse_packet_buf(delete_len);
    }
  }
  return resolver_num_packets;
}

//end解析数据包
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花开花落的个人博客

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值