///*****************************************************************************
//下面是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. 将Lambda表达式作为参数传递并解析-在构造函数参数列表中使用Lambda表达式

    public class DemoClass { /// <summary> /// 通过Lambda表达式,在构造函数中赋初始值 /// </summary> /// < ...

  2. python 并发编程 多线程 多线程实现并发的套接字通信

    进程内会生成一个主线程,让主线程执行server函数,server函数核心是accept(),让主线程干accept的工作, 建立连接,每建立一个连接应该执行通信函数 每建立一个连接就是生成一个子线程 ...

  3. Linux下路由配置梳理(转)

    转自:https://www.cnblogs.com/kevingrace/p/6490627.html 在日常运维作业中,经常会碰到路由表的操作.下面就linux运维中的路由操作做一梳理:----- ...

  4. 并发之AQS原理(二) CLH队列与Node解析

    并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...

  5. 洛谷 P1801 黑匣子 题解

    题面 离线处理: 大体思路就是将数组排序,然后对于第k次询问把不可行的数打上标记,然后从头开始寻找第k个没打标记的点的值(排序后的数组保证了它是第k小的). 实现方法:首先离散化原始数组,得到数组fi ...

  6. MySQL 分组统计查询 表连接(3)

    1 查询底薪超过公司平均底薪的员工信息? select e.empno,e.ename,e.salfrom t_emp as e join (select avg(sal) as avg from t ...

  7. [.net core]6.launchSettings.json,调试配置

    展开properties, 双击查看内容, { "iisSettings": { "windowsAuthentication": false, "a ...

  8. 使用 tablib 来自动化管理测试用例,其他的工具都不用学了

    你在学习 python 自动化测试吗?听过 requests 库吗?tablib 是 requests 库作者常年维护的一个可以操作 Excel 等多种文件格式,将他们变成一种通用数据集的第三方库. ...

  9. c# 模拟post登录

    使用模拟登录大致可以分为两步 一.post登录获取cookis public CookieContainer GetCookie(string url,string account,string pa ...

  10. batch文件改修中遇到的sql问题

    代码: <?php ////////////////////////////////////////////////////////// // //ダイハツ車種 car_cd毎 平均価格 JSO ...