基于STM32的CRC校验说明






///*****************************************************************************
//下面是test.c里面的函数
///*****************************************************************************
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//串口猎人用的程序 //////////
//值得说明的是,CRC协议同样适用于串口猎人适用,也就是”协议”是通用的 ////////
// USART1->DR=num; ////////
//串口猎人只能发送hex值,即只能发送16进制的数据,才能显示出波形 /////////
// while((USART1->SR&0X40)==0); ////////
// delay_ms(500); ////////
// num-=1; ////////
// if(num==0x00) ////////
// num=0xff; ///////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//值得说明的是,CRC协议同样适用于串口猎人适用,也就是”协议”是通用的 ////////
//串口助手用的程序 ////////
// printf("%d ",0XA5); ////////
// printf("%d ",t); ////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Visualscope串口示波器的程序 ////////
////////
for(i=;i<;i++)//先装载数据 ////////
{ ////////
OutData[i]= num; ////////
num-=; ////////
} ////////
num=0xff; ////////
OutPut_Data();//调用主函数 ////////
delay_ms();//定义发送频率 ////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///*****************************************************************************
//下面是USART.H里面的函数
///*****************************************************************************
//串口示波器的变量
extern float OutData[];//这是全局变量
unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT);
void voTxIsr(void);
void OutPut_Data(); ///*****************************************************************************//下面的是USART.C里面的文件
//这里用到了串口接收数据中断函数,所以需要把原先的数据串口中断函数屏蔽了
///*****************************************************************************
//the following is MCU code for CRC16 ,please refer.
//-------------------------------------------------------------------------------------------
#define ULONG unsigned long
#define RxCountMax 18
//float OutData[4]; 这个是全局变量,在main函数和USART.H中都有定义
unsigned short TxBuf[];
unsigned short RxBuf[RxCountMax];
unsigned short RxCnt;
unsigned short TxCnt;
unsigned short Rx50msCnt;
unsigned long pAddr1,pAddr2,pAddr3,pAddr4; //CRC16校验算法
unsigned short CRC_CHECK(unsigned short *Buf, unsigned short CRC_CNT)
{
unsigned short CRC_Temp;
unsigned char i,j;
CRC_Temp = 0xffff; for (i=;i<CRC_CNT; i++){
CRC_Temp ^= Buf[i];
for (j=;j<;j++) {
if (CRC_Temp & 0x01)
CRC_Temp = (CRC_Temp >> ) ^ 0xa001;
else
CRC_Temp = CRC_Temp >> ;
}
}
return(CRC_Temp);
} //Receive interrupt routine 串口接收中断函数
void USART1_IRQHandler(void)
{
unsigned short i,CRC_RX,CRC_Tmp;
RxBuf[RxCnt] = USART1->DR; //acquire data 接收数据
RxCnt++; if(RxCnt == RxCountMax) {
CRC_Tmp = CRC_CHECK(RxBuf,); //CRC Calculation 计算接收到的数据的CRC校验值
CRC_RX = ((unsigned short)RxBuf[RxCountMax-]<<) + RxBuf[RxCountMax-]; //接收的数据中的最后两位就是CRC校验值
if(CRC_Tmp == CRC_RX){ //比较两个校验值是否相同
LED0=~LED0; //这里是我做的一个现象,通信成功就亮/灭一下灯
pAddr1 = ((ULONG)(RxBuf[0x3])<<)|((ULONG)(RxBuf[0x2])<<)|((ULONG)(RxBuf[0x1])<<)|RxBuf[0x0]; //然后把数据保存起来
pAddr2 = ((ULONG)(RxBuf[0x7])<<)|((ULONG)(RxBuf[0x6])<<)|((ULONG)(RxBuf[0x5])<<)|RxBuf[0x4];
pAddr3 = ((ULONG)(RxBuf[0xB])<<)|((ULONG)(RxBuf[0xA])<<)|((ULONG)(RxBuf[0x9])<<)|RxBuf[0x8];
pAddr4 = ((ULONG)(RxBuf[0xF])<<)|((ULONG)(RxBuf[0xE])<<)|((ULONG)(RxBuf[0xD])<<)|RxBuf[0xC];
}
RxCnt = ;
}
Rx50msCnt = ;
//to add--Clear Receive Data Register Fll flag;
// USART1->DR=res;
// while((USART1->SR&0X40)==0);// } //Transfer interrupt routine 串口发送数据函数
void voTxIsr(void)
{
if(TxCnt <= )
{
USART1->DR = TxBuf[TxCnt];
//Clear Tx interrupt flag
TxCnt++;
if(TxCnt >= )
{
//send interrupt disable
TxCnt=;
}
}
} //-------------------------------------------------------------------------------------------
//Monitor routine Execute every T Period time 应用函数,在主函数中直接调用这个就可以了
void OutPut_Data()
{
int temp[] = {};
unsigned int temp1[] = {};
unsigned short databuf[] = {};
unsigned char i;
unsigned short CRC16 = ;
for(i=;i<;i++)
{
temp[i] = (u16)OutData[i]; //把要发送的数据传过来
temp1[i] = (u16)temp[i]; //并复制一份数据,进行下面的处理
} for(i=;i<;i++)
{
databuf[i*] = (u8)(temp1[i]%); //高低位处理
databuf[i*+] = (u8)(temp1[i]/);
} CRC16 = CRC_CHECK(databuf,); //计算要发送数据的CRC16校验值
databuf[] = CRC16%; //并保存在databuf的8 9里面
databuf[] = CRC16/; for(i=;i<;i++)//把数据和校验位一起发送出去
{
// voTxIsr();
if(TxCnt <= )
{
USART1->DR = databuf[TxCnt];//发送数据给寄存器
while((USART1->SR&0X40)==);//直到发送完成才结束发送
TxCnt++;
if(TxCnt >= )
{
TxCnt=; //准备下次发送数据
}
}
}
}
基于STM32的CRC校验说明的更多相关文章
- 文档:网络通讯包结构(crc校验,加解密)
一直想把这个流程整理一下. 包结构: 包 对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到 对(数据内容)进行crc计算而得到 协议号 数据内容的字节长度 ...
- 基于STM32的USB枚举过程学习笔记(转)
之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯.由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念, ...
- 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)
本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...
- 基于Verilog的CRC-CCITT校验
由于笔者在自己设计CRC模块时遇到很多问题,在网上并未找到一篇具有实际指导意义的文章,在经过多次仿真修改再仿真之后得到了正确的结果,故愿意在本文中为大家提供整个设计流程供大家快速完成设计.本文章主要针 ...
- CRC校验的C语言实现
文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7 ...
- CRC校验码原理、实例、手动计算
目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...
- 物联网平台设计心得:你所不知道的CRC校验
在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...
- CRC校验代码实现
1.CRC校验简介 CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”.CRC校验是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...
- CRC校验码
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...
随机推荐
- dos2unix Linux解决编写脚本出现“%0D
## Linux解决编写脚本出现“%0D”# 安装# yum install -y dos2unix# 然后进行转化一下脚本,将其中的install_mysql.sh换成你的脚本# dos2unix ...
- 详解MySql的配置文件my.cnf
1.Windows下MySQL的配置文件是my.ini,一般会在安装目录的根目录. 2.Linux下MySQL的配置文件是my.cnf,一般会放在/etc/my.cnf,/etc/mysql/my.c ...
- 小记---------网页采集之selenium
1.元素定位 ID定位元素: findElement(By.id(“”)); 通过元素的名称定位元素: findElement(By.name(“”)); 通过元素的html中的位置定位元素 ...
- javaSE温习一&二
这是一个简单的笔记 涉及到常量.变量:流程控制语句.数组:类与对象.封装.构造方法:Scanner类.Random类.Arraylist类: 1.pubic class static void 2. ...
- map的常见用法
map的常见用法 map 是什么? map是一组键值对的组合,通俗理解类似一种特殊的数组,a[key]=val,只不过数组元素的下标是任意一种类型,而且数组的元素的值也是任意一种类型.有点类似pyth ...
- spark日志+hivesql
windows本地读取hive,需要在resource里面将集群中的hive-site.xml下载下来. <?xml version="1.0" encoding=" ...
- RabbitMQ入门教程(八):远程过程调用RPC
原文:RabbitMQ入门教程(八):远程过程调用RPC 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.cs ...
- type=file 上传图片限制 类型和尺寸 方法
<form> <input type="file" name="pic" id="pic" accept="im ...
- Vue.js实现分页
效果图 代码 <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/ ...
- 一、JS基本基础
一.主流编辑器 早期 atom 前几年sublime 小巧,轻量,功能插件较多: webstorm 集成开发环境 vscode 免费开源的. 运行环境 : 浏览器端 谷歌,IE,fi ...