资源简介
以前做过一个智能家居项目,其中涉及数据包和命令包的打包解包。可以下载下来学习使用
代码片段和文件信息
#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
相关资源
- 全国所有大学数据包含经纬度(json格
- labview_CRC校验的vi源码
- CRC校验实验报告
- 各种CRC校验计算源码
- TCP和UDP数据包发送程序
- 数据包截获修改工具MonPack
- 串口工具带modebus crc校验
- Linux中的网络数据包捕获
- 拦截和转发网络数据包的设计与实现
- 第8章 TCP和UDP数据包发送程序
- asar文件解密加密打包解包工具
- TCP/UDP/ICMP数据包攻击软件
- CSDN-TCP基于数据包通讯框架
- 全国省市区县点位经纬度数据包含区
- 计算机网络课程设计-发送TCP数据包
- 解析ARP数据包报告
- 基于winpcap综合网络数据包扫描程序源
- CRC校验和工具
- linux下使用原始套接字抓包并发现网络
- 解析IP数据包课程设计报告
- 非常好用的抓包工具
- 数据包捕获器
- VC用HOOK拦截数据包的
- 串口调试软件带校验的
- 通过wireshark获取手机WIFI数据包
- tcp ipv6 pcap 数据包
- 数据包过滤研究与实现
- 用labview写的CRC校验
- Tcp数据包详细解析
- 解析IP数据包程序的设计与实现
评论
共有 条评论