在嵌入式开发中,Modbus 开源软件的移植主要取决于你的硬件平台(如 STM32、ESP32 或嵌入式 Linux)以及你需要的角色(主站 Master 或从站 Slave)。
以下是目前主流的 Modbus 开源库及其移植的核心流程。
| 软件库名称 | 适用场景 | 特点 |
|---|---|---|
| FreeModbus | MCU (单片机) 从站 | 工业级稳定性,专门为单片机优化,广泛用于 STM32。 |
| libmodbus | Linux / 高性能单片机 | 功能最全,支持 RTU/TCP,适合在具备操作系统的环境(如树莓派、Arm-Linux)运行。 |
| nanoMODBUS | 资源受限的微控制器 | 极其紧凑(仅两个文件),无需动态内存分配,适合极小 Flash 的 MCU。 |
| Agile Modbus | 跨平台 (单片机/Linux) | 国产开源,接口高度解耦,移植非常方便,支持主从模式。 |
移植过程本质上是将协议栈的逻辑代码与硬件的驱动代码(串口、定时器)进行对接。
从官网或 GitHub 下载源码,主要包含:
mb.c, mbrtu.c, mbframe.h 等。demo/BARE 下的 portserial.c(串口)和 porttimer.c(定时器)。portserial.c):
- vMBPortSerialEnable():控制 RS485 的收发使能引脚。
- xMBPortSerialInit():初始化单片机串口(波特率、校验位等)。
- xMBPortSerialPutByte() 和 xMBPortSerialGetByte():单字节的发送与接收。porttimer.c):
- Modbus RTU 依赖 3.5 字符时间来判断一帧结束。你需要配置一个硬件定时器,在接收到字节时重置,在超时时触发中断,调用 pxMBPortCBTimerExpired()。你需要实现四个关键的回调函数,将协议栈获取到的数据存入你的业务变量中:
eMBRegHoldingCB():保持寄存器(最常用,可读写)。eMBRegInputCB():输入寄存器(只读)。eMBRegCoilsCB():线圈(位操作)。eMBRegDiscreteCB():离散输入。移植完成后,推荐使用以下工具进行压力测试: