MODBUS通讯程序设计流程图

news/2024/5/19 0:28:25 标签: 流程图, 单片机, 嵌入式硬件, MODBUS, RS485

MODBUS通讯一般来说是基于RS485电平的通讯,RS485是半双工,很多单片机工程师做的通讯不是稳定,主要原因是流程没有掌控好。

我以前也犯过和他们一样错误,觉得很容易。在QQ群里,有位老工程师和大家一样犯了同样的毛病。曾经去一家公司面试,他们也遇到过类似的问题。他们咨询我用是什么485芯片,想知道一些信息。他们以为是自己的芯片问题,其实就是程序流程不正确。当然,这次面试肯定是泡汤,他们的动机不是招聘,而是想找答案。我告诉了芯片的型号,但具体流程设计,是口述的。面试时,当有人问解决方案时,就要注意留个心眼。

看似简单,那是因为你没有用到项目上去,只有做过的人才知道其中的奥妙。一次通讯正确,那不叫稳定,要能工作一年不出问题,才能说自己做好了。

1、变量定义如下:

#define RS485_TX_Overtime_RefValue    40   //发送完成最大等待时间为80ms,流程图直接用40
#define RS485_TX_Buffer_Size               17
u8 TX[RS485_TX_Buffer_Size];
u8 TXindex;//TX[]的发送下标值;
u8 Tmax;//TX[]的装载数据完成后的最大下标值
u8 TXstep;
u8 TXcnt;//RS485发送无从机超时计数器

#define Rmax               125
u8 RX[Rmax]; //RS485接收缓冲区数组
u8 RXindex;          //RX[]的装载索引值
u8 RXcnt;              //RS485接收时间计数器
u8 RXstep;

union RS485_CRC16_DATA_TYPE
{ uint8_t  b[2];
  uint16_t  d; //b[1]和d的高8位值相等;b[0]和d的低8位值相等;
};
union RS485_CRC16_DATA_TYPE  RS485_serial_crc;

uint8_t  High8Bit,Low8Bit;//用来保存计算到的CRC

2、流程图如下:

 

 照着上面的流程图设计,应该问题不大。

3、CRC循环冗长检测

//函数功能:CRC循环冗长检测
u16 FrequencyConverter_Crc16(u8 *data,u8 len)
{
    u16 ccitt16 = 0xA001;      //多项式0xA001
    u16 crc = 0xFFFF;
    int i;

    for(;len>0;len--)
  {
        crc^=*data;                  //异或
        for(i=0;i<8;i++)
        {
            if(crc & 0x0001)    //最低位为1,减去除数
            {
                crc>>=1;            //将最低位的1移出,剩下的数与0xA001异或
                crc^=ccitt16;
            }
            else                          //最高位为0,不需要减去除数
            {
                crc>>=1;                 //直接移位
            }
        }
        data++;
    }
    return crc;
}

4、装载举例

          TX[0] = 0x01;               //装载变频器设备地址
          TX[1] = 0x03;               //装载MODBUS读命令
          TX[2] = RegAdress>>8;       //装载寄存器地址的高8位值
          TX[3] = RegAdress&0xFF;     //装载寄存器地址的低8位值
          TX[4] = DataOrNumber1>>8;   //装载读取数据长度的高8位值
          TX[5] = DataOrNumber1&0xFF; //装载读取数据长度的低8位值
          crc16 = FrequencyConverter_Crc16(&TX[0],6);    //计算CRC16的值
          TX[6] = (u8)(crc16&0x00FF); //装载CRC16的低8位值
          TX[7] = (u8)(crc16>>8);     //装载CRC16的高8位值
          Tmax = 7;//设置TX[]中的最大装载索引值

5、结论

流程图,在实际案例中使用过,很不错。

欢迎交流,互相进步。


http://www.niftyadmin.cn/n/314604.html

相关文章

FE_Vue学习笔记 - 计算属性 监视属性

1 计算属性 1.1 计算属性的引入 组件模板应该只包含简单的表达式&#xff0c;复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么&#xff0c;而非如何计算那个值。而且计算属性和方法使得代码可以重用。 …

2022年美国大学生数学建模竞赛D题数据瘫痪? 使用我们的分析!解题全过程文档及程序

2022年美国大学生数学建模竞赛 D题数据瘫痪? 使用我们的分析! 原题再现&#xff1a; 背景   很多公司将数据视为战略资产&#xff0c;但却很难从中获益。妥善管理这一资源(数据)可以带来竞争优势。因此&#xff0c;公司需要建立一一个集成的数据和分析(D&A) 系统&…

Spring Cloud第二季--Spring Cloud Bus

文章目录 Spring Clud Bus什么是总线基本原理 牛刀小试 Spring Clud Bus 在Spring Cloud学习–配置中心&#xff08;Config&#xff09;中实现了集中管理微服务配置、不同环境不同配置、运行期间也可动态调整、配置修改后可以自动更新的需求&#xff0c;但同时也有一个弊端&am…

MYSQL事务隔离机制及事务优化

在并发执行多个事务操作&#xff0c;对同一批数据进行操作时&#xff0c;会导致一些系列事务问题&#xff1a;脏写&#xff0c;脏读&#xff0c;不可重复读&#xff0c;幻读等。为解决这些事务问题&#xff0c;mysql 通过事务隔离机制&#xff0c;锁机制&#xff0c;MVCC及日志…

USBCAN卡和台达AS228T通信

AS228R 如图 A.把CAN卡固定上 B.接一个120欧的终端电阻 C.把来可的USBCAN卡的CANH和CANL分别接入AS228R的CANH和CANL. CAN 接口及网络拓扑 10.2.4.1 CAN 网络实体信号的定义及数据格式 CAN 信号为差分信号&#xff0c;信号电压为 CAN和 CAN-之间的电压差&#xff0c;CAN 和…

【beego】bee工具安装使用

bee 工具是一个为了协助快速开发 beego 项目而创建的项目&#xff0c;通过 bee 您可以很容易的进行 beego 项目的创建、热编译、开发、测试、和部署。 1、安装 go get github.com/beego/bee2、配置bee.exe 运行完以上指令后&#xff0c;打开$GOPATH/bin &#xff0c;我的路径…

typescript学习笔记(上)

公司有用到typescript在项目里&#xff0c;系统学习一下 1、typescript介绍 1.1 什么是typescript? TypeScript简称TSTS和JS之间的关系其实就是Less/Sass和CSS之间的关系就像Less/Sass是对CSS进行扩展一样, TS也是对JS进行扩展就像Less/Sass最终会转换成CSS一样, 我们编写好…

使用requests+parsel+pandas+mysql完成的一个爬虫示例

一个爬虫示例 目标网址&#xff1a;链家二手房 使用到的库 requests 网络请求parsel 网页解析pandas 数据处理和存储pymysql、dbutils 数据持久化 其中MySQL存储用的是一个封装好的API类 传送门: mysql-client-tools 说明 数据的存储会有两种模式&#xff0c;一种是直接…