///*****************************************************************************
//下面是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校验说明的更多相关文章

  1. 文档:网络通讯包结构(crc校验,加解密)

    一直想把这个流程整理一下. 包结构: 包 对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到 对(数据内容)进行crc计算而得到 协议号 数据内容的字节长度 ...

  2. 基于STM32的USB枚举过程学习笔记(转)

    之前使用ST官方的库以及网络的资料,完成了使用USB HID类进行STM32和PC机的通讯.由于其他原因并没有深入的分析,虽然实现了功能,但是关于USB设备的枚举,以及具体的通讯方式都没有清晰的概念, ...

  3. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  4. 基于Verilog的CRC-CCITT校验

    由于笔者在自己设计CRC模块时遇到很多问题,在网上并未找到一篇具有实际指导意义的文章,在经过多次仿真修改再仿真之后得到了正确的结果,故愿意在本文中为大家提供整个设计流程供大家快速完成设计.本文章主要针 ...

  5. CRC校验的C语言实现

    文章转自 循环冗余校验(CRC)算法入门引导 - Ivan 的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/liyuanbhu/article/details/7 ...

  6. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  7. 物联网平台设计心得:你所不知道的CRC校验

    在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...

  8. CRC校验代码实现

    1.CRC校验简介 CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”.CRC校验是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...

  9. CRC校验码

    循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...

随机推荐

  1. 深入理解java:4.1. 框架编程之Spring MVC

    说到java的mvc框架,struts2和springmvc想必大家都知道, Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高 ...

  2. python 列表的(总结)

    列表(自我总结) 1.在python中什么是列表 列:排列,表:一排数据 在python中的表达就是 l = [1,2,3,4,5,6,7] 2.列表是可变类型还是不可变类型 也就是说列表能不能被ha ...

  3. 记一则update 发生enq: TX - row lock contention 的处理方法

    根据事后在虚拟机中复现客户现场发生的情况,做一次记录(简化部分过程,原理不变) 客户端1执行update语句 SQL> select * from test; ID NAME --------- ...

  4. 交换机安全学习笔记 第二章 MAC地址泛洪攻击

    本文为书中相关知识的摘要,由于书中以思科设备为配置依据,所以笔记中补充了华为.H3C设备的相关配置.华为设备配置参考华为S2352EI 产品版本:V100R005C01文档版本:02.  H3C配置参 ...

  5. Luogu P1450 [HAOI2008]硬币购物

    题目 一个很自然的想法是容斥. 假如只有一种硬币,那么答案就是没有限制的情况下买\(s\)的方案数减去强制用了\(d+1\)枚情况下买\(s\)的方案数即没有限制的情况下买\(s-c(d+1)\)的方 ...

  6. c++ vector 使用注意事项

    1. 初始化 c++ 11以后新增了大括号{}的初始化方式,需要注意与()的区别,如: std::vector<int> vecTest1(5);         //初始化5个元素,每个 ...

  7. luoguP4578_ [FJOI2018]所罗门王的宝藏

    题意 一个n*m的矩阵,初始值全为0,每一行每一列操作一次可以加1或者减1,问能否操作得到给定矩阵. 分析 行和列的分别的加减是可以相互抵消的,因此我们只需要考虑行的加和列的减. 对于给定矩阵每一个数 ...

  8. picgo+typora优化markdown体验

    picgo+typora优化markdown体验 写markdown的时候许多图片的存放的上传是一个大问题,之前一直都是使用先截图,在commit之后,再将线上图片地址粘贴到相应的位置 现在知道了pi ...

  9. IIS发布出现[Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配

    一,原因是系统DSN的配置平台位数跟系统的位数不一致(PS:确认你有没有安装对应系统的驱动.本文是34位和64位驱动都安装了) 二,解决方法,我们必须在 <控制面板---管理工具>找到对应 ...

  10. css 超出部分显示省略号 汇总

    单行: 加宽度 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; 多行: display: -webkit-box; -we ...