本资料包是包含了10+完整的Modbus源码。硬件平台基于STM32 F103或F4. 包括了master slave模式。实现协议有 RTU UIP UART 485等。。。
资料包结构如下:
FreeModbus_Slave-Master-NOOS-STM32-master.zip
FreeModbus_Slave-Master-RTT-STM32-master.zip
ModBus-Master-master.zip
Modbus-STM32-HAL-FreeRTOS-master.zip
stm32_dual_modbus-master.zip
STM32_HAL_FREEMODBUS_RTU-master.zip
stm32_modbus-master.zip
stm32f4_modbus_tcp-master.zip
STM32-FreeModbus-Example-master.zip
STM32-Modbus-SerialDMA-master.zip
uip_freemodbus_tcp-master.zip
每一个包结构清晰,代码完整。包内配有详细说明方便阅读理解。
# MODBUS MASTER RTU在STM32上的实现 #
## 1. 概述 ##
– 最近需要将几个信号采集模块通过总线串联起来,这样便于系统模块化。故将目光注意到了工业上经常使用的modbus协议。
– modbus协议是一种一主多从的拓扑结构,主要是应用层软件协议,有关modbus的相关信息,可以自行google、百度。
– STM32实现的Master工程代码在github上,
## 2. 开发环境 ##
– STM32F042单片机
– MDK-KEIL5
– STM32-CUBE库
– Modbus slaver测试软件
## 3. 移植来源 ##
– 信号采集模块作为slaver,采用的是开源的freemodbus协议。
关于其实现大家百度一下都能发现,相关的移植过程介绍也很多,不再一一赘述。值得注意的是:这个freemodbus的源码值得一看,其判断对一帧数据包的接受采用的是定时器判断超时。大体思路是中断接收函数在接收每一个字节数据时会重置定时器,如果定时器发生定时溢出中断,则说明没有新数据到来,代表一帧数据包接收完整。
然后就是master的设计实现。freemodbus并没有开源的master实现代码,故这部分需要我们自己开发完成。在github上发现有个人发布arduino版本的master,但是arduino的代码来C++语言编写,需要我们做一些C语言的移植和一些硬件底层接口的移植。
## 4. 移植过程 ##
– 了解arduino modbus库的实现思路——很简单明了。打开源工程,里面有源代码和例程代码,不过例程代码需要用arduino的ID打开。其大体思路就是每个Modbus Function都用一个函数实现,如
uint8_t ModbusMaster::readDiscreteInputs(uint16_t u16ReadAddress, uint16_t u16BitQty)
{
_u16ReadAddress = u16ReadAddress;
_u16ReadQty = u16BitQty;
return ModbusMasterTransaction (ku8MBReadDiscreteInputs);
}
这帧ModbusMasterTransaction函数就是根据用户选择的功能模










