[ESP32]:基于esp-modbus实现serial从机

本文详细介绍了如何在ESP32平台上利用esp-modbus库实现串行从机功能,包括定义离散输入、线圈和保持寄存器,以及根据主机事件处理读写操作。作者还分享了一个实验示例,设置保持寄存器的值并处理各种事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[ESP32]:基于esp-modbus实现serial从机

开发环境:

  • esp idf 5.1
  • esp-modbus 1.0.13

使用如下指令添加组件,或者访问esp-modbus

idf.py add-dependency "espressif/esp-modbus^1.0.13"

1.mb_register_area_descriptor_t

对于slave而言,最重要的定义你的reg area

// 离散输入寄存器
mb_register_area_descriptor_t descrete_reg_area = {
    .type = MB_PARAM_DISCRETE,
    .start_offset = 0x0000,
    .address = (void *)&discrete_reg_params,
    .size = sizeof(discrete_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(descrete_reg_area));

// 线圈
mb_register_area_descriptor_t coil_reg_area = {
    .type = MB_PARAM_COIL,
    .start_offset = 0x0000,
    .address = (void *)&coil_reg_params,
    .size = sizeof(coil_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(coil_reg_area));

// 保持寄存器
mb_register_area_descriptor_t holding_reg_area = {
    .type = MB_PARAM_HOLDING,
    .start_offset = 0x0000,
    .address = (void *)&holding_reg_params,
    .size = sizeof(holding_reg_params_t),
};
ESP_ERROR_CHECK(mbc_slave_set_descriptor(holding_reg_area));

可以看到我们这里定义了输入寄存器,保持寄存器、线圈

其中,偏移默认为0x0000,如果要修改的话,记得同步改上位机的偏移地址

2.等待主机读取

这个比较简单,主要根据event做对应的动作就行

while (1)
{
    mb_event_group_t event = mbc_slave_check_event(MB_READ_WRITE_MASK);

    if (event & MB_EVENT_DISCRETE_RD)
    {
        // 主机读取离散输入寄存器
        ESP_ERROR_CHECK(mbc_slave_get_param_info(&reg_info, 10));
        ESP_LOGI(TAG, "DISCRETE READ");
    }
    else if (event & MB_EVENT_COILS_RD)
    {
        // 主机读取线圈
        ESP_LOGI(TAG, "COIL READ");
    }
    else if (event & MB_EVENT_COILS_WR)
    {
        // 主机写线圈
        ESP_LOGI(TAG, "COIL WRITE");
        ESP_LOGI(TAG, "Coil: %d %d", coil_reg_params.coils_port_0, coil_reg_params.coils_port_1);
    }
    else if (event & MB_EVENT_HOLDING_REG_RD)
    {
        // 主机读取保持寄存器
        ESP_LOGI(TAG, "HOLDING READ");
    }
    else if (event & MB_EVENT_HOLDING_REG_WR)
    {
        // 主机写保持寄存器
        ESP_LOGI(TAG, "HOLDING WRITE");
        ESP_LOGI(TAG, "Holding: %d %d", holding_reg_params.holding_0, holding_reg_params.holding_1);
    }
}

感觉做从机比主机简单一点。

简单跑一个实验:
我们设置保持寄存器的两个值为1234和7788

holding_reg_params_t holding_reg_params = {1234, 7788};

在这里插入图片描述

### 使用 ESP32 和 Arduino Serial 实现 Modbus RTU 功能 #### 准备工作 为了使 ESP32 能够作为 Modbus RTU 从站并通过串口通信,在开始编程前需完成如下准备工作: - **硬件准备** - ESP32 开发板。 - 连接线材用于连接计算ESP32- **软件环境搭建** - 安装并设置好最新版本的 Arduino IDE[^1]。 - 添加 ESP32 支持到 Arduino IDE 中。这可以通过打开 Arduino IDE 的首选项页面,向附加开发板管理器网址添加 `https://dl.espressif.com/dl/package_esp32_index.json` 并保存更改来实现- 利用 Arduino IDE 的库管理功能下载并安装适用于 ESP32Modbus RTU 库。 #### 配置教程 ##### 设置 Arduino IDE 环境变量 确保选择了正确的端口号以及对应的 ESP32 板型。进入 Tools -> Board Manager, 查找并选择合适的 ESP32 模型;接着确认波特率被设定为默认值(通常是 115200),这些都可以在 Tools 下找到相应选项调整。 ##### 编写代码逻辑 下面是一个简单的例子展示如何利用 Arduino IDE 创建一个基于 ESP32Modbus RTU 从站应用程序。此实例中假设使用的是 UART0 (GPIO1/UART_TXD 和 GPIO3/UART_RXD),并且已经成功加载了必要的库文件。 ```cpp #include <ModbusRTU.h> // 初始化 Modbus 对象 ModbusRTU mb; void setup() { // 启动串行监视器 Serial.begin(9600); // 将 ESP32 设定为 Modbus RTU 从设备,地址设为 1 mb.begin(&Serial, 1); // 设置传输速率,默认为 9600 波特率 mb.setBaudRate(9600); } void loop() { // 处理来自主站的消息请求 mb.task(); } ``` 这段代码实现了基本的功能框架,即初始化了一个 Modbus RTU 类对象,并将其绑定到了指定的串行接口上运行于特定节点 ID 下。此外还设置了数据交换速度参数以便与其他设备兼容。 对于更复杂的应用场景,则可能涉及到更多的寄存器读取或写入操作等功能扩展。此时可以根据实际需求调用相应的 API 方法来进行处理,比如 `mb.writeSingleRegister()` 或者 `mb.readInputRegisters()` 等函数[^3]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值