协议栈中使用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校验值
思路以及步骤:
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校验值
#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型显示时会出现问题
4、将函数调用的时候会出现新的问题:只能显示低8位,无法显示高8位。原因是分配的存储空间不一样。cc是2个字节长度的数据,而dat[]只能接受一个字节的长度的数据。具体解决方法还未想明白,欢迎指导
协议栈中使用crc校验函数的更多相关文章
- delphi crc校验函数
function CalCRC16(AData: array of Byte; AStart, AEnd: Integer): string;const GENP=$8408; //多项式公式X1 ...
- CRC校验原理和verilog实现方法(一)
1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性.网上有关这方面的博客和资料很多,本 ...
- 基于Lwip协议栈中独立模式下回调函数的使用
一.使用Lwip协议独立模式开发 最近在STM32F4上边移植了Lwip,Lwip是一个小型开源的TCP/IP协议栈,有无操作系统的支持都可以运行.我当前只测试了TCP Server功能,然后对TCP ...
- 物联网平台设计心得:你所不知道的CRC校验
在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...
- CRC校验源码分析
这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...
- 字符串CRC校验
字符串CRC校验 <pre name="code" class="python"><span style="font-family: ...
- 16位CRC校验_Delphi
unit Modbus_main; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, G ...
- CRC校验的实现
本例提供的是通过查表发来实现CRC校验. CRC余式表如下: unsigned int crctab[256] ={/*CRC余式表 */ 0x0000, 0x1021, 0x2042, 0x3063 ...
- CRC校验算法学习
原文:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 本文根据上述链接原文翻译而来,如有错误,忘广大网友互相帮忙纠正,谢谢! 1.前言: 1.0 ...
随机推荐
- 1 - django-介绍-MTV-命令-基础配置-admin
目录 1 什么是web框架 2 WSGI 3 MVC与MTV模式 3.1 MVC框架 3.2 MTV框架 3.3 区别 4 django介绍 4.1 Django处理顺序 4.2 创建django站点 ...
- TcxScheduler的使用
TcxScheduler有两种工作模式: 一.非绑定模式 非绑定模式下,数据被存储在文件系统中.要让scheduler工作在非绑定模式下,应使TcxScheduler.Storage属性绑定到TcxS ...
- MySQL 四种链接
1.内联接 INNER JOIN(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行. ...
- vue总结05 过渡--状态过渡
状态过渡 Vue 的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,比如: 数字和运算 颜色的显示 SVG 节点的位置 元素的大小和其他的属性 所有的原始数字都 ...
- docker centos:last 开启sshd 遇到的证书问题
启动sshd: # /usr/sbin/sshd 一.问题描述 这时报以下错误: [root@ xxx/]# /usr/sbin/sshd Could not load host key: /etc/ ...
- python网络编程--线程GIL(全局解释器锁)
一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...
- Python元组与字典详解
Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup ...
- java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...
- 如何阻止点击scrollviewer里面的单位内容时,自动滚动
<Style TargetType="{x:Type ListBoxItem}"> <Setter Property="FocusVisualStyle ...
- java 内部类的继承
因为内部类的构造器必须连接到指向其外部类对象的引用. 因为在继承内部类的时候那个指向外部类对象的"秘密的"引用必须被初始化,而在导出类中不再存在可连接的默认对象,要解决这个问题必须 ...
function CalCRC16(AData: array of Byte; AStart, AEnd: Integer): string;const GENP=$8408; //多项式公式X1 ...
1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性.网上有关这方面的博客和资料很多,本 ...
一.使用Lwip协议独立模式开发 最近在STM32F4上边移植了Lwip,Lwip是一个小型开源的TCP/IP协议栈,有无操作系统的支持都可以运行.我当前只测试了TCP Server功能,然后对TCP ...
在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...
这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...
字符串CRC校验 <pre name="code" class="python"><span style="font-family: ...
unit Modbus_main; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, G ...
本例提供的是通过查表发来实现CRC校验. CRC余式表如下: unsigned int crctab[256] ={/*CRC余式表 */ 0x0000, 0x1021, 0x2042, 0x3063 ...
原文:http://www.repairfaq.org/filipg/LINK/F_crc_v31.html 本文根据上述链接原文翻译而来,如有错误,忘广大网友互相帮忙纠正,谢谢! 1.前言: 1.0 ...
目录 1 什么是web框架 2 WSGI 3 MVC与MTV模式 3.1 MVC框架 3.2 MTV框架 3.3 区别 4 django介绍 4.1 Django处理顺序 4.2 创建django站点 ...
TcxScheduler有两种工作模式: 一.非绑定模式 非绑定模式下,数据被存储在文件系统中.要让scheduler工作在非绑定模式下,应使TcxScheduler.Storage属性绑定到TcxS ...
1.内联接 INNER JOIN(典型的联接运算,使用像 = 或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行. ...
状态过渡 Vue 的过渡系统提供了非常多简单的方法设置进入.离开和列表的动效.那么对于数据元素本身的动效呢,比如: 数字和运算 颜色的显示 SVG 节点的位置 元素的大小和其他的属性 所有的原始数字都 ...
启动sshd: # /usr/sbin/sshd 一.问题描述 这时报以下错误: [root@ xxx/]# /usr/sbin/sshd Could not load host key: /etc/ ...
一:什么是GIL 在CPython,全局解释器锁,或GIL,是一个互斥体防止多个本地线程执行同时修改同一个代码.这把锁是必要的主要是因为当前的内存管理不是线程安全的.(然而,由于GIL存在,其他特性已 ...
Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: tup ...
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...
<Style TargetType="{x:Type ListBoxItem}"> <Setter Property="FocusVisualStyle ...
因为内部类的构造器必须连接到指向其外部类对象的引用. 因为在继承内部类的时候那个指向外部类对象的"秘密的"引用必须被初始化,而在导出类中不再存在可连接的默认对象,要解决这个问题必须 ...