- agile_modbus 即:轻量型 modbus 协议栈,是我在使用其他第三方库过程中进行归纳而形成的一个库。
- 其支持 rtu 及 tcp 协议,使用纯 C 开发,不涉及任何硬件接口,可在任何形式的硬件上直接使用。
- 由于其使用纯 C 开发、不涉及硬件,完全可以在串口上跑 tcp 协议,在网络上跑 rtu 协议。
- 支持符合 modbus 格式的自定义协议。
- 支持常用功能码,如下:
/* Modbus function codes */
#define AGILE_MODBUS_FC_READ_COILS 0x01
#define AGILE_MODBUS_FC_READ_DISCRETE_INPUTS 0x02
#define AGILE_MODBUS_FC_READ_HOLDING_REGISTERS 0x03
#define AGILE_MODBUS_FC_READ_INPUT_REGISTERS 0x04
#define AGILE_MODBUS_FC_WRITE_SINGLE_COIL 0x05
#define AGILE_MODBUS_FC_WRITE_SINGLE_REGISTER 0x06
#define AGILE_MODBUS_FC_READ_EXCEPTION_STATUS 0x07
#define AGILE_MODBUS_FC_WRITE_MULTIPLE_COILS 0x0F
#define AGILE_MODBUS_FC_WRITE_MULTIPLE_REGISTERS 0x10
#define AGILE_MODBUS_FC_REPORT_SLAVE_ID 0x11
#define AGILE_MODBUS_FC_MASK_WRITE_REGISTER 0x16
#define AGILE_MODBUS_FC_WRITE_AND_READ_REGISTERS 0x17
- 使用简单,只需要将 rtu 或 tcp 句柄初始化好后,调用响应 API 进行组包和解包即可。
- 作为从机使用时只简单提供了解包 API,因为从机的处理多种多样,个人没有能力抽象出一个通用的类。而像
libmodbus
里的 mapping
结构根本应对不了多少场合。如果您能想到更好的方法,希望能够告知。
- 初始化 rtu 句柄
int agile_modbus_rtu_init(agile_modbus_rtu_t *ctx, uint8_t *send_buf, int send_bufsz, uint8_t *read_buf, int read_bufsz)
参数 |
注释 |
ctx |
rtu 句柄 |
send_buf |
发送缓冲区地址 |
send_bufsz |
发送缓冲区大小 |
read_buf |
接收缓冲区地址 |
read_bufsz |
接收缓冲区大小 |
- 初始化 tcp 句柄
int agile_modbus_tcp_init(agile_modbus_tcp_t *ctx, uint8_t *send_buf, int send_bufsz, uint8_t *read_buf, int read_bufsz)
参数 |
注释 |
ctx |
tcp 句柄 |
send_buf |
发送缓冲区地址 |
send_bufsz |
发送缓冲区大小 |
read_buf |
接收缓冲区地址 |
read_bufsz |
接收缓冲区大小 |
- 设置从机地址
int agile_modbus_set_slave(agile_modbus_t *ctx, int slave)
- 打包请求数据
agile_modbus_serialize_xxx
返回 |
注释 |
< 0 |
异常,可能是发送缓冲区太小 |
其他 |
请求数据长度 |
- 解析响应数据
agile_modbus_deserialize_xxx
返回 |
注释 |
< 0 |
异常 (-1:报文错误;其他:可根据 -128 - $返回值 得到异常码) |
其他 |
对应功能码响应对象的长度。如 03 功能码,值代表寄存器个数 |
- 解析主机发来的数据
int agile_modbus_receive_judge(agile_modbus_t *ctx, int msg_length)
参数 |
注释 |
ctx |
句柄 |
msg_length |
接收到的数据的长度 |
基于 STM32F103,使用 RT-Thread Nano
。该 demo 实现了 rtu 及 tcp 的例子,rtu 使用串口作为演示;tcp 使用 ESP8266 演示,支持微信配网。
该 demo 也可作为 RT-Thread Nano
学习的参考例程。
- 示例地址为: 地址
- 定期维护