协议数据打包

打包数据可以根据此模式进行修改自己需要的,解包下一篇文章介绍

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>


#define DEBUG printf("%d %s\n",__LINE__,__func__)
 
typedef unsigned char UCHAR;
typedef unsigned int   UINT;
typedef unsigned short UINT16;


/*向平台发送的数据报侦头*/
static UCHAR DDC_head[] = 
{
0xA5, 0xA6//帧头
};
/*向平台发送的数据包功能吗*/
static UCHAR CMD_head[] = 

   0x05     //功能码
}; 
/*向平台发送的数据包校验*/
static UCHAR Crc_end[] = 
{
   0xFF //数据校验值
};


/*向硬件设备发送的数据报侦头*/
static UCHAR DEV_head[] = 
{
0x0A, 0x0B//帧头
};
/*向硬件设备发送的数据包功能吗*/
static UCHAR CMD_DEV[] = 

   0x05     //功能码
}; 
/*向硬件设备发送的数据包校验*/
static UCHAR Crc_DEV[] = 
{
   0xFF //数据校验值
};


/*数值型数据转换为字符型*/
int itoc(UINT16 num, UCHAR data[], UINT type)
{
if (data == NULL)
{
return -1;
}
        DEBUG;  
switch(type)
{
case 4:
data[3] = (UCHAR)((num&0xFF000000)>>24);
case 3:
data[2] = (UCHAR)((num&0xFF0000)>>16);
case 2:
data[1] = (UCHAR)((num&0xFF00)>>8);
case 1:
data[0] = (UCHAR)(num&0xFF);
break;
default:
break;
}
       
return 0;
}


/***********3.5      DDC上传传感器数据报文*****************/
int pack_ddc(UCHAR *msgall,  UCHAR *ddmsg) //参数传输数据ddmsg,打包后的报文:
{
        if(msgall == NULL)
                return 0;
if(ddmsg == NULL)
return 0; 
       
UINT16 num =(int)( strlen(ddmsg) + 2);

memset(msgall, 0, 4+sizeof(DDC_head)+sizeof(ddmsg));
 
memcpy(msgall, DDC_head, sizeof(DDC_head));                                   //报头
UCHAR data[4] = {0}; 
itoc(num, data, 2); 
       
memcpy(msgall+sizeof(DDC_head), data, 2);                                     //数据长度
        memcpy(msgall+sizeof(DDC_head)+2,  CMD_head, sizeof(CMD_head));               //功能码
              
  memcpy(msgall+sizeof(DDC_head)+2+sizeof(CMD_head), ddmsg, strlen(ddmsg));            //数据

        memcpy(msgall+sizeof(DDC_head)+2+sizeof(CMD_head)+strlen(ddmsg), Crc_end, sizeof(Crc_end));//校验码
return 1;


}


/********************向硬件设备发送信息报文***********************/
int pack_dev(UCHAR * msgall,UCHAR *iD,UCHAR *mes)    //参数设备id ,要发送的数据mes,打包数据存储在pack—mes里面
{
    
      if(msgall == NULL)
               return 0; 
      if(mes == NULL)  
               return 0;
      UINT16 num =(int)( strlen(mes) );
      UCHAR data[4] = {0}; 
      itoc(num, data, 2); 
      memset(msgall,0,strlen(mes)+6);
      memcpy(msgall, DEV_head, sizeof(DEV_head));                           //报头
      memcpy(msgall+sizeof(DEV_head),iD, 1);                                //设备ID
         
      memcpy(msgall+sizeof(DEV_head)+1,CMD_DEV,sizeof(CMD_DEV));            //功能码
    
      memcpy(msgall+sizeof(DEV_head)+1+sizeof(CMD_DEV),data,2);             //数据长度


      memcpy(msgall+sizeof(DEV_head)+1+sizeof(CMD_DEV)+2,mes,strlen(mes));  //数据段


      memcpy(msgall+sizeof(DEV_head)+1+sizeof(CMD_DEV)+2+strlen(mes),Crc_DEV,sizeof(Crc_DEV)); //校验位
      return 1;
}




/********  测试打包情况  ****************/  
int main()
{
         static UCHAR message[] ={0x12};  //
          UCHAR ID[] = {0X01};

        UCHAR msgall[1024]; 
        memset(msgall,0,1024);
        pack_dev(msgall,ID,message);
//pack_ddc(msgall,message);
        int i;
        for(i = 0; i<30;i++)
{
            printf("%.2x",msgall[i]);
        }        
        printf("\n");
return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
nrf24l01是一款非常受欢迎的2.4GHz无线收发器,在许多无线通信应用中广泛使用。当我们使用nrf24l01进行数据通信时,我们需要对数据进行打包以便在无线信道上传输。 数据打包是指将需要传输的数据进行组织和编码,以便于发送端和接收端之间进行正确的解析和处理。下面是一个关于nrf24l01数据打包的简要步骤: 1. 数据长度确定:首先,我们需要确定要传输的数据的长度。通常,nrf24l01具有固定的最大有效数据长度,通常为32字节。确保数据长度不超过此限制。 2. 数据编码:接下来,对数据进行编码以确保数据的正确解析和处理。常见的编码方式包括二进制、十进制、十六进制等。根据应用需求选择合适的编码方式。 3. 数据分片:如果数据长度超过了nrf24l01的最大有效数据长度,则需要将数据分片。将数据拆分成合适的大小,以确保每个片段都可以在信道上成功传输。 4. 添加校验和:为了保证数据的完整性和正确性,我们可以添加校验和。校验和是通过对数据进行运算生成的一个数值,接收端可以通过计算校验和来验证数据的完整性,发现损坏或错误的数据。 5. 打包数据:最后,将所有的数据片段和校验和按照特定的格式进行打包和组织。通常,数据打包包括数据长度、数据内容、校验和等信息。确保数据按照协议规定的格式进行打包。 一旦数据打包完成,我们可以使用nrf24l01的发送和接收函数来进行数据的传输。发送端将打包好的数据通过nrf24l01发送出去,接收端通过nrf24l01接收数据,并对接收到的数据进行解包和处理。 总结一下,nrf24l01数据打包涉及确定数据长度、编码数据、分片数据、添加校验和以及打包和组织数据等步骤。合理的数据打包可以确保数据的完整性和正确性,提高无线通信的可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值