///*****************************************************************************
//下面是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. 【神经网络与深度学习】学习笔记:AlexNet&Imagenet学习笔记

    学习笔记:AlexNet&Imagenet学习笔记 ImageNet(http://www.image-net.org)是李菲菲组的图像库,和WordNet 可以结合使用 (毕业于Caltec ...

  2. Linux内核基础优化

    Linux内核基础优化 net.ipv4.ip_forward = 1 #开启网络转发 net.ipv4.conf.default.rp_filter = 0 #开启代理功能 net.ipv4.con ...

  3. 如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)

    以下为线程 阻塞/唤醒  主要代码 public class MyThread extends Thread { //无意义 private final Object lock = new Objec ...

  4. 移除list里面的值

    public class IteratorTest { public static void main(String[] args) { List<String> list = new A ...

  5. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  6. py3.7安装Scrapy及安装时的 Running setup.py install for Twisted ... error 和安装后的 Unhandled error in Deferred:

    1.首先,win+r 进入cmd,打开命令提示符,输入  pip install scrapy  等待自动安装: 2.到了后半段会出现  Running setup.py install for Tw ...

  7. MyBatis按时间排序

    测试代码 ActivityReadExample readExample = new ActivityReadExample(); readExample.setOrderByClause(" ...

  8. gitlab 安装、配置

    gitlab 安装.配置 对于企业级的私有 git 仓库,gitlab 是个不错的选择. 今天就来说说 gitlab 的安装.配置. 系统配置建议:最低双核 4G 内存. 当前针对 gitlab 版本 ...

  9. orm的设计思路

    一,我们先搞懂什么是orm? ORM:对象关系映射(Object Relational Mapping,简称ORM),目的是想像操作对象一样操作数据库.因为数据库不是面向对象的,所以需要编程进行映射. ...

  10. ELK-全文检索技术-使用总结

    一.概念 1.1 基础概念 ELK: 是ElasticSearch,LogStash以及Kibana三个产品的首字母缩写 lucene : apache 的全文搜索引擎工具包 elasticsearc ...