当前位置:首页 > C > 正文

C语言Modbus库使用教程(手把手教你用C语言实现Modbus RTU通信)

在工业自动化和嵌入式系统开发中,Modbus协议是一种广泛应用的串行通信协议。本文将带你从零开始,使用C语言Modbus库实现一个简单的 Modbus RTU 通信程序,适合完全没有经验的小白开发者。

什么是Modbus?

Modbus 是一种主从式通信协议,常用于连接工业电子设备。它支持两种传输模式:RTU(远程终端单元)和 ASCII。其中,Modbus RTU 因其紧凑、高效而被广泛应用于嵌入式系统中。

C语言Modbus库使用教程(手把手教你用C语言实现Modbus RTU通信) C语言Modbus库 Modbus RTU通信 C语言嵌入式开发 Modbus从站实现 第1张

为什么选择C语言Modbus库?

对于资源受限的微控制器(如 STM32、AVR、ESP32 等),使用轻量级的 C 语言实现 Modbus 协议非常合适。C语言嵌入式开发社区中,有许多开源的 Modbus 库,例如 libmodbus 和更轻量的 freemodbus。本文将以 freemodbus 为例进行讲解。

准备工作

  • 一台运行 Linux/Windows 的开发主机
  • 一个支持 UART 的微控制器(如 STM32F103C8T6)
  • USB 转 TTL 模块(用于串口通信)
  • 安装好 GCC 或 Keil/IAR 等编译环境
  • 下载 FreeMODBUS 源码

步骤一:初始化Modbus从站

我们以实现一个 Modbus从站 为例(即设备响应主站请求)。首先,在你的项目中包含 FreeMODBUS 头文件:

#include "mb.h"#include "mbport.h"// 定义线圈(Coils)和保持寄存器(Holding Registers)的存储区uint8_t ucRegCoils[16];uint16_t usRegHolding[8];  

步骤二:配置并启动Modbus

在 main 函数中初始化 Modbus 并启用相关功能:

int main(void){    // 初始化硬件(如时钟、GPIO、UART等)    hardware_init();    // 初始化 Modbus RTU 模式,从站地址为 1,波特率 9600,N-8-1    eMBInit(MB_RTU, 0x01, 0, 9600, MB_PAR_NONE);    // 启用线圈(功能码 01)    eMBEnable();    // 映射线圈地址 0x0000 - 0x000F 到 ucRegCoils    eMBRegisterCB(0x0000, 16, MB_REG_COIL, (void*)ucRegCoils);    // 映射保持寄存器 0x0000 - 0x0007 到 usRegHolding    eMBRegisterCB(0x0000, 8, MB_REG_HOLDING, (void*)usRegHolding);    while (1)    {        // 轮询 Modbus 事件        eMBPoll();                // 其他任务...    }}  

步骤三:移植底层驱动

FreeMODBUS 需要你实现几个底层函数,比如串口发送/接收、定时器中断等。你需要修改 portserial.cporttimer.c 文件,适配你的硬件平台。

例如,在 vMBPortSerialEnable 中启用/禁用串口中断:

void vMBPortSerialEnable(BOOL xRxEnable, BOOL xTxEnable){    if (xRxEnable)    {        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);    }    else    {        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);    }    if (xTxEnable)    {        USART_ITConfig(USART1, USART_IT_TC, ENABLE);    }    else    {        USART_ITConfig(USART1, USART_IT_TC, DISABLE);    }}  

测试你的Modbus从站

你可以使用 PC 上的 Modbus 调试工具(如 QModMaster、Modbus Poll)通过 USB-TTL 连接你的设备,读写线圈或寄存器,验证通信是否正常。

总结

通过本教程,你已经学会了如何使用 C语言Modbus库 实现一个基本的 Modbus从站。这为后续的 C语言嵌入式开发 打下了坚实基础。掌握 Modbus RTU通信 后,你可以轻松连接 PLC、HMI 或上位机系统,构建完整的工业控制网络。

提示:实际项目中请根据硬件平台调整串口和定时器配置,并注意 Modbus 地址偏移(有些工具从 1 开始编号,而协议内部从 0 开始)。