基于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 ...
随机推荐
- 【神经网络与深度学习】【Qt开发】【VS开发】从caffe-windows-visual studio2013到Qt5.7使用caffemodel进行分类的移植过程
[神经网络与深度学习][CUDA开发][VS开发]Caffe+VS2013+CUDA7.5+cuDNN配置成功后的第一次训练过程记录<二> 标签:[神经网络与深度学习] [CUDA开发] ...
- python 并发编程 多线程 互斥锁
互斥锁 并行变成串行,牺牲效率 保证数据安全,实现局部串行 保护不同的数据,应该加不同的锁 现在一个进程 可以有多个线程 所有线程都共享进程的地址空间 实现数据共享 共享带来问题就会出现竞争 竞争就会 ...
- Elasticsearch-集群增加节点
ES-在集群中加入节点 查看分片信息 FengZhendeMacBook-Pro:nacos FengZhen$ curl 'localhost:9200/_cat/shards?v' index s ...
- Selenium+PhantomJs 爬取网页内容
利用Selenium和PhantomJs 可以模拟用户操作,爬取大多数的网站.下面以新浪财经为例,我们抓取新浪财经的新闻版块内容. 1.依赖的jar包.我的项目是普通的SSM单间的WEB工程.最后一个 ...
- 创建一个py文件并运行
在 Linux 中,可以直接用vim 或者 vi 来编辑一个 python 文件 vim hello.py 进入编辑页面 #coding:utf-8 print("你好") (因为 ...
- 解决:centos配置ssh免密码登录后仍要输入密码
转自https://www.jb51.net/article/121180.htm 第一步:在本机中创建秘钥 1.执行命令:ssh-keygen -t rsa 2.之后一路回车就行啦:会在-(home ...
- js 判断图片和视频是否加载成功
图片: 失败: // 方法 1:更换图片地址 $('img').error(function(){ $(this).attr('src', '加载失败.png'); }); // 方法 2:隐藏它 $ ...
- 修改jar包package目录结构操作方法
开发中会遇到用第三方的jar包,有时候会出现不同的jar包,包名一致的情况,这就会引发运行时异常,找不到相应的jar包. 这种问题时常困扰我们很长时间.下面提出一种解决办法,例如gson.jar. 1 ...
- Git生成公钥.pub 及秘钥 命令
Git生成公钥.pub 及秘钥 命令 ssh-keygen -t rsa -C "******@qq.com" 将.pub公钥里面内容复制到github或者将这文件交给git管理员 ...
- 初探 -2 JavaScript
JavaScript 简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScrip ...