zoukankan      html  css  js  c++  java
  • 协议栈中使用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(" ");
    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[]只能接受一个字节的长度的数据。具体解决方法还未想明白,欢迎指导

  • 相关阅读:
    nginx构建https
    安装mysql的遇到的问题
    docker mysql 2059
    centos7 安装chrome
    谷歌浏览器启动参数
    php-webdriver:PHP控制浏览器动作, php web驱动, PHP实现自动化, php webdriver 教程, A php client for webdriver.
    nginx转发
    nginx变量与实列
    mysql 语句
    frp 内网穿透配置
  • 原文地址:https://www.cnblogs.com/aqyl/p/6729495.html
Copyright © 2011-2022 走看看