找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10401|回复: 10
收起左侧

Modbus中对CRC16校验的STM32串口通信源码

  [复制链接]
ID:321960 发表于 2018-5-4 11:51 | 显示全部楼层 |阅读模式
小白学习汇总

单片机源程序如下:
  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, 下载次数: 294)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:242969 发表于 2018-7-4 09:38 | 显示全部楼层
下载学习学习 谢谢
回复

使用道具 举报

ID:370386 发表于 2018-7-17 11:50 | 显示全部楼层
学习了
回复

使用道具 举报

ID:381554 发表于 2018-8-1 09:48 | 显示全部楼层
谢谢楼主!!
回复

使用道具 举报

ID:389528 发表于 2018-9-26 09:53 | 显示全部楼层
请问你个用提STM32什么芯片?
回复

使用道具 举报

ID:409584 发表于 2018-10-14 19:53 | 显示全部楼层
Thanks for Sharing
回复

使用道具 举报

ID:496304 发表于 2019-3-22 19:00 | 显示全部楼层
感谢分享
回复

使用道具 举报

ID:410139 发表于 2019-3-28 20:48 | 显示全部楼层
正准备用modbus,谢谢楼主分享
回复

使用道具 举报

ID:311601 发表于 2019-12-23 14:01 | 显示全部楼层
Thanks For You
回复

使用道具 举报

ID:498853 发表于 2020-4-14 15:24 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:134197 发表于 2020-9-8 17:04 | 显示全部楼层
为什么用 modbus poll调试不通?一直连接超时
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表