标题:
Modbus中对CRC16校验的STM32串口通信源码
[打印本页]
作者:
wz20150126
时间:
2018-5-4 11:51
标题:
Modbus中对CRC16校验的STM32串口通信源码
小白学习汇总
单片机源程序如下:
#include "stm32f10x.h"
#include"crc.h"
/*ModBus 计算CRC码的步骤为:
(1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;
(2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;
(3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
(4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行下一个8位数据的处理;
(7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)
*/
/*****************crc校验**********************************************/
//crc生成函数,并将crc存储在预先定于的数组中
//调用方式crc16(指向数据的指针,需要校验的数据长度)
u16 crc16(u8 *ptr,u8 len)
{
unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1
int i=0,j=0;//定义计数
for(i=0;i<len;i++)//循环计算每个数据
{
wcrc^=*ptr++;//将八位数据与crc寄存器亦或.指针地址增加,指向下个数据
for(j=0;j<8;j++)//循环计算数据的
{
if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。
{
wcrc=wcrc>>1^0XA001;//先将数据右移一位再与上面的多项式进行异或
}
else//如果不是1,则直接移出
{
wcrc>>=1;//直接移出
}
}
}
return wcrc<<8|wcrc>>8;//低八位在前,高八位在后
}
复制代码
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
extern u8 Rcv_Busy;//用来说明串口能不能继续接收下一帧数据
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为9600
TIM3_Int_Init(499,7199);//定时器初始化为50ms中断一次
while(1)
{
if(Rcv_Busy==1)//串口忙
ModHandle();//处理接受到的数据
}
}
复制代码
所有资料51hei提供下载:
modbus实验.rar
(286.49 KB, 下载次数: 297)
2018-5-5 02:19 上传
点击文件名下载附件
下载积分: 黑币 -5
UartAssist.rar
(524.68 KB, 下载次数: 148)
2018-5-4 11:50 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
swap1
时间:
2018-7-4 09:38
下载学习学习 谢谢
作者:
小欧阳
时间:
2018-7-17 11:50
学习了
作者:
Leo_
时间:
2018-8-1 09:48
谢谢楼主!!
作者:
lmwife
时间:
2018-9-26 09:53
请问你个用提STM32什么芯片?
作者:
hesan921
时间:
2018-10-14 19:53
Thanks for Sharing
作者:
白歌
时间:
2019-3-22 19:00
感谢分享
作者:
wo411322
时间:
2019-3-28 20:48
正准备用modbus,谢谢楼主分享
作者:
staticx
时间:
2019-12-23 14:01
Thanks For You
作者:
login51hdzlt
时间:
2020-4-14 15:24
谢谢分享
作者:
ROGERER
时间:
2020-9-8 17:04
为什么用 modbus poll调试不通?一直连接超时
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1