协议栈中使用crc校验函数

CRC校验介绍:循环冗余校验码,原理是多项式除法

ZigBee协议栈:能够使zigbee节点相互之间组网,数据传输,数据获取,数据显示

思路以及步骤:

1、因为IAR的程序是用c写的,所以上网查找如何用C编写一个CRC校验函数

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int data[] = {0x01,0x03,0x00,0x00,0x00,0x04,0x02};//以一个7个字节的数组举例
  5. int i=0, j=0,cc = 0xffff;
  6. for(i=0; i<7;i++){ //这个长度是根据数组长度决定的
  7. cc = (cc^data[i]);
  8. for(j=0;j<8; j++){
  9. if((cc & 0x01) == 1){
  10. cc = ((cc >> 1) ^0xa001);
  11. }else{
  12. cc = (cc >> 1);
  13. }
  14. }
  15. }
  16. printf("%d",cc); //输出10进制CRC校验值
  17. printf("\n");
  18. 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型显示时会出现问题

4、将函数调用的时候会出现新的问题:只能显示低8位,无法显示高8位。原因是分配的存储空间不一样。cc是2个字节长度的数据,而dat[]只能接受一个字节的长度的数据。具体解决方法还未想明白,欢迎指导

posted @ 2017-04-18 19:24  sky七月凉  阅读(1150)  评论(0编辑  收藏  举报