资源简介

以前做过一个智能家居项目,其中涉及数据包和命令包的打包解包。可以下载下来学习使用

资源截图

代码片段和文件信息

#include “pack.h“

/*函数名称:unsigned int crc_16
  函数功能:16 bit crc校验
  输入参数:unsigned short *ptr(存放需要校验的16bit的数据)
  函数返回值:32位的数据包
*/
unsigned int crc_16(unsigned short *ptr)
{
unsigned short *ptrr = ptr;
unsigned int len  = 16;
unsigned long temp = 0;
unsigned int crc;
unsigned char i;
//unsigned short *ptr = data;

while(len--)
{
for(i = 0x80;i != 0; i = i >> 1)
{
temp = temp * 2;
if ((temp & 0x10000) != 0)
temp = temp ^ 0x11021;
if ((*ptrr & i) != 0)
temp = temp ^ (0x10000 ^ 0x11021);
}
//printf(“%x\n“*ptr);
ptrr++;
}
crc = temp;
return crc;
}

/*函数名称:unsigned int datapack
  函数功能:打包
  输入参数:struct DATA A(存放需要打包的数据(温度))
  函数返回值:32位的数据包
*/
unsigned int datapack(struct DATA A)
{
//start coding
short d;//值
short t;//临时变量
short a;//存放A.data
short c;//循环变量
short i;//余数
short b[7];//存放a的二进制值
short e2[7]={248163264128};//b的算子
unsigned int out;
unsigned int crc;
unsigned short data[16];
//unsigned short *ptr = data;

d=0;    //只使用正数部,(0)(16)
t = 0;   //数据模式(0,0)(1514)
d=d+t;

if (A.th == 0)//温度(00)(1312)
{
t = 0;
d = d+t;
}
else  //湿度(01)(1312)
{
t = 2048;
d = d+t;
}
if (A.id == 1)//id (0,00)(1110,9)
{
t = 0;
d = d+t;
}
else if (A.id == 2) //id (0,01)(1110,9)
{
t = 256;
d = d+t;
}
else if (A.id == 3) //id (0,10)(1110,9)
{
t = 512;
d = d+t;
}
else //id (0,11)(1110,9)
{
t = 256+512;
d = d+t;
}

a = A.data;
while(a!=0)
{
i = a%2;
b[c]=i;
c++;
a=a/2;
}

for(;c>=0;c--)
{
t = b[c]*e2[c];
d = d+t;
}
//printf(“d = %x\n“d);
//return d;
//crc
data[0] = d;
crc = crc_16(data);
//printf(“crc = %x\n“crc);
out = out + data[0];
out = out << 16;
out = out + crc;
//printf(“0x%x\n“out);
return out;
}

/*函数名称:struct DATA datadepack
  函数功能:解包
  输入参数:unsigned int in(存放需要解包的数据(温度))
  函数返回值:结构体struct DATA(存放数据)
*/
struct DATA datadepack(unsigned int in)
{
//crc
short d;
unsigned int out;
unsigned int crc;
unsigned short data[16]={0};
data[0] = (in >> 16);
//printf(“%d\n“data[0]);
//unsigned short *ptr = data;
crc = crc_16(data);
//printf(“%x\n“crc);
out = out + data[0];
out = out << 16;
out = out + crc;
if (in != out)
printf (“数据错误\n“);
else
{
d = data[0];
// decoding
struct DATA A;//创建一个结构体
short a=0;//输入数据复制体
short i=0;//余数
short c=0;//循环变量
short b[16]={0};//存放a的二进制值
short e2[7]={1248163264};//b的算子
a = d;
while(a!=0)
{
i = a%2;
b[c]=i;
c++;
a=a/2;
}

//for (c=0;c<=15;c++)
//printf(“%d “b[c]);
//printf(“\n“);

if (b[11]==0)
A.th = 0;
else
A.th = 1;

if (b[9]==0)
{
if (b[8]==0)
A.id = 1;
else
A.id = 2;
}
else
{
if (b[8]==0)
A.id = 3;
else
A.id = 4;
}

a = 0;
for (c=0;c<=6;c++)
{
a += b[c+1]*e2[c];
//printf(“%d * %d \n“b[c+1]e2[c]);
}
//printf(“%d\n“a);
A.data = a;

return A;
}

}

/*函数名称:unsigned int cmdpack
  函数功能:打包
  输入参数:struct CMD A(存放需要打包的数据(命令))
  函数返回值:32位的数据包
*/
unsigned int cmdpack(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件         243  2017-10-16 01:36  数据打包解包库(含CRC校验)\makefile
     文件        6119  2017-10-23 01:18  数据打包解包库(含CRC校验)\pack.c
     文件        1399  2017-10-23 09:06  数据打包解包库(含CRC校验)\pack.h
     文件        4568  2017-10-23 01:27  数据打包解包库(含CRC校验)\pack.o
     文件         213  2017-10-16 10:38  数据打包解包库(含CRC校验)\readme.txt
     文件       13008  2017-10-23 01:27  数据打包解包库(含CRC校验)\test_c
     文件         771  2017-10-23 01:19  数据打包解包库(含CRC校验)\test_c.c
     文件        2664  2017-10-23 01:27  数据打包解包库(含CRC校验)\test_c.o
     文件       13008  2017-10-23 01:27  数据打包解包库(含CRC校验)\test_d
     文件         690  2017-10-23 01:20  数据打包解包库(含CRC校验)\test_d.c
     文件        2488  2017-10-23 01:27  数据打包解包库(含CRC校验)\test_d.o
     文件       15374  2017-10-16 11:01  数据打包解包库(含CRC校验)\项目数据结构解析v1.3.docx

评论

共有 条评论