点击上方,选择“置顶/星标公众号”
大家好,我是麦鸽,在工业自动化、物联网设备开发中,Modbus 协议凭借其简单可靠的特点,成为设备通信的常用标准。
然而,在资源受限的嵌入式系统中,如何高效实现 Modbus 协议往往是一大挑战。
本文将介绍一款专为嵌入式设计的轻量级 C 语言库——nanoModbus,帮助开发者快速构建稳定高效的 Modbus 通信功能。
项目地址:https://github.com/debevv/nanoMODBUS
传统 Modbus 库往往功能庞大,占用较多内存和计算资源,难以在微控制器等硬件资源有限的环境中运行。nanoModbus 应运而生,其核心设计理念是精简高效:
以下通过一个 TCP 客户端示例,展示如何用 nanoModbus 实现寄存器读写:
#include "nanomodbus.h"
// 自定义平台读写函数(需开发者实现)
int32_t my_transport_read(uint8_t* buf, uint16_t count, int32_t timeout_ms, void* conn) {
return tcp_read((SocketHandle)conn, buf, count, timeout_ms);
}
int32_t my_transport_write(const uint8_t* buf, uint16_t count, int32_t timeout_ms, void* conn) {
return tcp_write((SocketHandle)conn, buf, count, timeout_ms);
}
int main() {
// 1. 初始化平台配置
nmbs_platform_conf platform_conf;
nmbs_platform_conf_create(&platform_conf);
platform_conf.transport = NMBS_TRANSPORT_TCP;
platform_conf.read = my_transport_read;
platform_conf.write = my_transport_write;
platform_conf.arg = tcp_connect("192.168.1.100", 502); // 连接Modbus服务端
// 2. 创建客户端实例
nmbs_t nmbs;
nmbs_client_create(&nmbs, &platform_conf);
// 3. 批量写入2个寄存器(地址26)
uint16_t write_data[2] = {123, 124};
nmbs_write_multiple_registers(&nmbs, 26, 2, write_data);
// 4. 读取验证
uint16_t read_data[2];
nmbs_read_holding_registers(&nmbs, 26, 2, read_data);
tcp_close(platform_conf.arg);
return0;
}
通过四步操作即可完成通信流程,代码简洁易维护。
nanoModbus 提供两种集成方式:
直接将 nanomodbus.c
和 nanomodbus.h
加入项目,适用于小型工程。
通过 CMake 自动拉取仓库并链接库文件:
include(FetchContent)
FetchContent_Declare(
nanomodbus
GIT_REPOSITORY https://github.com/debevv/nanoMODBUS
GIT_TAG master
)
FetchContent_MakeAvailable(nanomodbus)
target_link_libraries(your_project nanomodbus)
nanoModbus 通过平台函数抽象实现跨平台,开发者需实现两个关键函数:
// 从串口/TCP读取数据
int32_t your_read_func(uint8_t* buf, uint16_t count, int32_t timeout_ms, void* arg);
// 向串口/TCP写入数据
int32_t your_write_func(const uint8_t* buf, uint16_t count, int32_t timeout_ms, void* arg);
timeout_ms < 0
表示无限等待,=0
表示非阻塞。代码裁剪
通过宏定义禁用不需要的功能,如 NMBS_CLIENT_DISABLED
可移除客户端代码,进一步减小体积。
调试支持
定义 NMBS_DEBUG
宏可打印通信报文,便于排查问题。
超时设置
使用 nmbs_set_read_timeout()
针对不同网络环境调整超时阈值,提升通信稳定性。
通过本文的介绍,希望您能快速掌握 nanoModbus 的核心能力,为您的嵌入式项目增添高效通信支持。
由于最近登录github总是遇到这种情况,如下所示;
所以麦鸽把源码下载过来了,有需要的小伙伴,在公众号后台回复【nanoModbus】,即可获取源码。
往期推荐