TLV协议的装包与解包(C语言)

本文介绍了TLV(Tag-Length-Value)协议的基本概念,包括其报文格式和在数据传输中防止错误的方法。通过在字节流末尾添加CRC校验来确保数据的完整性。接着详细讲解了TLV的封包和解包过程,封包涉及如何将数据转换为TLV格式,而解包则阐述了如何从接收到的字节流中正确解析出TLV元素,包括校验CRC以验证数据准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.TLV简介

TLV :即Tag(Type)-Length-Value,它包含三个域,第一个Tag为要封装的数据的类型域,第二个Length为封装的总的数据长度,第三个Value为要装入数据的值。其实就是一个简单的自定义通信协议,将要传送的数据进行编码组织将其发送出去的过程。
在这里插入图片描述
这是基本的tlv报文格式,在实际应用中我们可能会碰见在传输过程中数据发生跳变,这时候我们需要在一个字节流末尾加一个CRC校验,传输前算一下字节流的大小,传输到另外一个端口后再算一下,对比前后两个CRC的值,如果相同,表示没有发生字节跳变,反之,则舍弃。
加工后tlv报文:
在这里插入图片描述
PACK_HEADE是自己定义的(0xFD),大小通常为一个字节;Tag也是自己定义,通常为一个字节;Length的大小要看你的数据所占用的字节大小,它的大小为包头大小+Tag大小+Length大小+校验和大小+数据字节大小,自身一般占用一个字节;crc校验和一般占两个字节。发送过程中如果不加头,发送的数据0x05 0x02 0x3c,在接收端就会以Tag(Type)-Length-Value顺序进行解析,正常情况下可以获取到正确的值,但是当发生数据跳变或者混入其他数据时,接收端按照之前的顺序解析就会出错,当我们加上头的时候,接收端解析的时候会先找到包头,然后按顺序解析,但是这样还是有出错的可那,但是加上crc校验和之后,crc根据接收到的数据计算出一个校验和,用来和装包装进去的校验和进行比较,如果相同说明这一帧数据正确,接收端才会开始解析数据,如果不正确就不解析。

2.TLV的封包

下面是我对获取到的温度进行装包的代码:

 int  packtlv_temp(char *buf, int size)
 {
   
     unsigned short crc16=0;
     int     pack_len = 0;
     int     data_len = 0;
     int     ofset = 0;
     float   temp;
     char    datatime[32];
     int     i,j;
  
      if(!buf || size < TLV_MINI_SIZE)
      {
   
  
          printf("Invalid input adgument\n");
          return 0;
  
      }
           /*   Packet head */ 
      buf[ofset]=HEAD;
      ofset +=1;
  
       /*   Tag */ 
      buf[ofset]=TAG_TEMP;
      ofset 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值