标题: Modbus中对CRC16校验的STM32串口通信源码 [打印本页]

作者: wz20150126    时间: 2018-5-4 11:51
标题: Modbus中对CRC16校验的STM32串口通信源码
小白学习汇总

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include"crc.h"
  3. /*ModBus 计算CRC码的步骤为:

  4. (1).预置16位寄存器为FFFFH。称此寄存器为CRC寄存器;

  5. (2).把第一个8位数据与CRC寄存器的低位相异或,把结果放于CRC寄存器;

  6. (3).把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;

  7. (4).如果最低位为0:重复第3步(再次移位)如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;

  8. (5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;

  9. (6).重复步骤2到步骤5,进行下一个8位数据的处理;

  10. (7).最后得到的CRC寄存器即为CRC码。(CRC码 = CRC_L +CRC_H)

  11. */

  12. /*****************crc校验**********************************************/

  13. //crc生成函数,并将crc存储在预先定于的数组中

  14. //调用方式crc16(指向数据的指针,需要校验的数据长度)



  15. u16 crc16(u8 *ptr,u8 len)

  16. {

  17. unsigned long wcrc=0XFFFF;//预置16位crc寄存器,初值全部为1

  18. int i=0,j=0;//定义计数

  19. for(i=0;i<len;i++)//循环计算每个数据

  20.         {

  21.                 wcrc^=*ptr++;//将八位数据与crc寄存器亦或.指针地址增加,指向下个数据

  22.                 for(j=0;j<8;j++)//循环计算数据的

  23.                         {

  24.                                 if(wcrc&0X0001)//判断右移出的是不是1,如果是1则与多项式进行异或。

  25.                                         {
  26.                                                 wcrc=wcrc>>1^0XA001;//先将数据右移一位再与上面的多项式进行异或
  27.                                         }

  28.                                 else//如果不是1,则直接移出

  29.                                         {
  30.                                                 wcrc>>=1;//直接移出
  31.                                         }
  32.                         }
  33.         }
  34. return wcrc<<8|wcrc>>8;//低八位在前,高八位在后
  35. }
复制代码
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "timer.h"

  5. extern u8 Rcv_Busy;//用来说明串口能不能继续接收下一帧数据
  6. int main(void)
  7. {               

  8.         delay_init();                     //延时函数初始化         
  9.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  10.         uart_init(115200);         //串口初始化为9600
  11.         TIM3_Int_Init(499,7199);//定时器初始化为50ms中断一次
  12.         while(1)
  13.                 {
  14.                         if(Rcv_Busy==1)//串口忙
  15.                                 ModHandle();//处理接受到的数据
  16.                 }
  17. }
复制代码

所有资料51hei提供下载:
modbus实验.rar (286.49 KB, 下载次数: 297)
UartAssist.rar (524.68 KB, 下载次数: 148)



作者: 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