初出茅庐的小李第20篇博客之modbus协议杂记

地址+ 数据 (功能码+数据)+校验
m把设备抽象化
四类
输入离散量 (单个bit操作)
线圈(单个bit操作)
保持寄存器(16bit 操作oled)
输入寄存器(16bit DHT11 MQ2 MQ135)

想要实现功能用功能码

公共功能码
用户定义功能码
保留功能
串行数据上的数据格式:RTU \ASCII

RTU:节点地址+功能码+数据+CRC校验
保证地址唯一:用芯片ID校验出来的,也可以做成协议自动分配
功能码:03码
数据:1-253
CRC:2个字节

如何确认和那一个设备进行的通信
如何获取设备号?
主机要获取所有节点的ID,采用广播的形式进行通信
可以自定义一个功能码
广播 地址0 +功能码0x00(自定义功能码)+数据0X00(不要数据直接放0x00)+CRC
广播后如何接受不同节点的回传
要解决总线竞争的问题,一个方式做协议
一个是用延时,分时复用总线
设备号 延时时间
主从机进行通信
主机结构用485接口,+485驱动
编写其发送函数
编写接收函数(串口中断保证实时性+定时器的溢出中断(t3.5))
总线通讯
获取总线上节点地址
主机发送0x00 +0x00+0x00+CRC_L+CRC_H
广播地址自定义功能码数据校验
从机回应
id +0x00+0x00+CRC_L+CEC_H
设备号 +功能码+数据+校验
获取节点的数据
温度 湿度 烟雾 空气质量 光照强度 红外状态 人员有否

主机发送
设备号 ID+ 0x03(功能码)+数据 0x00+寄存器起始地址0x00 0x07+CRC_L+CRC_H
从机发送
ID+0x03+0x0E(0X07*2)+温湿度…+CRC

你可能感兴趣的:(笔记)