协议栈中使用crc校验函数
CRC校验介绍:循环冗余校验码,原理是多项式除法
ZigBee协议栈:能够使zigbee节点相互之间组网,数据传输,数据获取,数据显示
思路以及步骤:
1、因为IAR的程序是用c写的,所以上网查找如何用C编写一个CRC校验函数
#include<stdio.h>int main(){int data[] = {0x01,0x03,0x00,0x00,0x00,0x04,0x02};//以一个7个字节的数组举例int i=0, j=0,cc = 0xffff;for(i=0; i<7;i++){ //这个长度是根据数组长度决定的cc = (cc^data[i]);for(j=0;j<8; j++){if((cc & 0x01) == 1){cc = ((cc >> 1) ^0xa001);}else{cc = (cc >> 1);}}}printf("%d",cc); //输出10进制CRC校验值printf("\n");printf("%x",cc); //输出16进制的CRC校验值

2、在CodeBlock编译器例面运行成功以后,将代码完整的复制到IAR文件中
这时会看到,数据显示不正确,按照思路同样的代码,在C语言编译中输出的16进制是f288,那么在这里输出的应该是88 F2。(因为实际需求需要低位在前,高位在后)。
3、将int cc修改为int16 cc


可以看到输出结果没问题了。为什么会出现这种问题呢?int的数据范围不是-65536到65536吗?这是因为我们平常用C编译器的时候用的内存时计算机的内存,可以让很大的数据得以显示。但是在IAR中,我们用的CC2530的单片机的芯片,它的内存时有限的,我所用的单片机内存只有256kb,所以用int型显示时会出现问题

浙公网安备 33010602011771号