0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LuatOS:485 总线硬件设计要点与 exmodbus 库开发实战

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2026-03-19 17:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在工业物联网通信开发中,485 总线与 Modbus 协议的组合应用十分常见。本文以Air780EHV 系列模组为实例,围绕 LuatOS 开发环境,详解 485 总线的硬件设计细节,包括其与 UART 的关联、电平匹配处理及不同防护等级的 TVS 器件选型,同时介绍 LuatOS 轻量化的 exmodbus 扩展库,并给出该库实现 Modbus RTU 主站通信的代码示例与相关文档查阅渠道。

Air780EHV 系列模组的相关参数说明如下:

该模组可适配多种外设,包含 SPI 串口屏、墨水屏、OLED 单色屏、30 万像素摄像头,同时具备 CANRJ45 以太网、485、USB、UART、SPI、I2C、PWM、GPIO 等接口
网络通信方面,模组支持 TCP/UDP、TCP-SSL/TCP-TLS、FTP、MQTT、HTTP、WebSocket、NTP、Modbus 协议。
模组集成 4G 通信与音频模块,可实现语音通话、录音播放以及 TTS 功能。
工业通信中非常经典的485总线,硬件设计中需要注意的细节,Modbus协议在LuatOS开发中的应用,详见下文。

一、485总线接口与UART的关系

485总线接口本质上是UART总线接口的一种应用,需要搭配485收发器芯片实现。

二、电平匹配问题

在UART与485收发器芯片的搭配中,最常见需要注意的一个问题是电平匹配。

由于上一章节参考设计中Air780EHV和SP3485都是3.3V的IO电平,所以不再需要分立元器件电平转换电路或电平转换芯片。

当双方电平不一致时,则需要分立元器件电平转换电路或电平转换芯片。

常见的分立元器件电平转换电路如下:

三、485总线接口的TVS防护

工业现场环境复杂,485总线经常面临静电、浪涌等威胁,因此接口保护必不可少。

485接口用TVS,常用的型号有SM712系列,如果防护等级要求较高,也可以选择如下推荐的型号。

ESD等级防护:适用于一般静电防护场景。型号:应能微ASM712

TVS等级防护:具备2KV 1.2/50uS浪涌能力。型号:应能微SMBJ7.0CAW

TSS等级防护:具备4KV 10/700uS浪涌能力。型号:应能微P0080SA

四、Modbus通信协议

与485总线接口相关的通信协议是Modbus。LuatOS的modbus核心库,但使用难度较高。而exmodbus扩展库——在核心库的基础上封装了更简洁易用的API,降低开发难度,易于开发者集成Modbus通信。

exmodbus最新API文档详见资料中心

核心示例持续更新中!

PROJECT = "RTU_MASTER"
VERSION = "001.000.000"

-- 在日志中打印项目名和项目版本号
log.info("main", PROJECT, VERSION)

local exmodbus = require("exmodbus")

-- 使用 Air8000 开发板测试打开这两个
gpio.setup(16, 1)         -- RS485 芯片供电引脚
local rs485_dir_gpio = 17 -- RS485 方向引脚

-- 使用 Air780EPM 开发板测试打开这三个;
-- gpio.setup(1, 1)          -- Air780EPM RS485 芯片供电引脚
-- gpio.setup(23, 1)         -- Air780EPM vref 脚拉高
-- local rs485_dir_gpio = 24 -- Air780EPM RS485 方向引脚(V1.2 是 25,V1.3 是 24)

-- 创建 RTU 主站配置参数;
-- 说明:创建 RTU 主站时只需要配置如下参数即可;
local create_config = {
-- 串口配置参数;
mode = exmodbus.RTU_MASTER,      -- 通信模式
uart_id = 1,                     -- UART 端口
baud_rate = 115200,              -- 波特率
data_bits = 8,                   -- 数据位
stop_bits = 1,                   -- 停止位
parity_bits = uart.None,         -- 校验位
byte_order = uart.LSB,           -- 字节顺序
rs485_dir_gpio = rs485_dir_gpio, -- RS485 方向引脚
rs485_dir_rx_level = 0,          -- RS485 接收方向电平
}

-- 初始化从站 1 数据结构
-- 用于记录从站 1 保持寄存器 0-1 的值;
local slave1_data = {}

-- 配置读取从站 1 保持寄存器 0-1 的值;
local read_config = {
raw_request = string.char(
0x01,       -- 从站地址
0x03,       -- 功能码:读取保持寄存器
0x00, 0x00, -- 寄存器起始地址
0x00, 0x02, -- 寄存器数量
0xC4, 0x0B  -- CRC16校验码
),
timeout = 1000  -- 超时时间 1000 ms
}

-- 创建 RTU 主站实例
local rtu_master = exmodbus.create(create_config)

-- 判断主站是否创建成功并记录日志
if not rtu_master then
log.info("exmodbus_test", "rtu_master 创建失败")
else
log.info("exmodbus_test", "rtu_master 创建成功")
end

-- 读取从站 1 保持寄存器数据的函数
local function read_slave1_holding_registers()
log.info("exmodbus_test", "开始读取从站 1 保持寄存器 0-1 的值")

-- 执行读取操作
local read_result = rtu_master:read(read_config)

-- 根据返回状态处理结果
if read_result.status == exmodbus.STATUS_SUCCESS then
local resp = read_result.raw_response

-- 特别说明:
-- 接下来的判断是针对 modbus RTU 标准响应格式的应答原始帧来解析的
-- 在实际项目中,应根据自己项目中的实际应答原始帧格式进行解析
-- 如果实际格式与此处演示的格式不一致,需要修改接下来的解析代码

-- 1. 检查总长度:必须为 9 字节(1 地址 + 1 功能码 + 1 字节数 + 4 数据 + 2 CRC)
if #resp ~= 9 then
log.info("exmodbus_test", "响应长度错误,期望 9 字节,实际:", #resp)
return
end

-- 2. 检查从站地址
if string.byte(resp, 1) ~= 0x01 then
log.info("exmodbus_test", "从站地址不匹配,收到:", string.byte(resp, 1))
return
end

-- 3. 检查功能码
local func_code = string.byte(resp, 2)
if func_code == 0x83 then
local exc_code = string.byte(resp, 3)
log.info("exmodbus_test", "从站返回异常响应,异常码:", exc_code)
return
elseif func_code ~= 0x03 then
log.info("exmodbus_test", "功能码错误,收到:", func_code)
return
end

-- 4. 检查字节数字段(应为 4)
local byte_count = string.byte(resp, 3)
if byte_count ~= 4 then
log.info("exmodbus_test", "字节数字段错误,期望 4,实际:", byte_count)
return
end

-- 5. 校验CRC
-- 计算前 7 字节的 CRC
local crc_calculated = crypto.crc16_modbus(resp:sub(1, 7))
-- 提取接收到的 CRC
local crc_received = string.unpack("< I2", resp, 8)
-- 比较 CRC
if crc_calculated ~= crc_received then
log.info("exmodbus_test", "CRC 校验错误,计算值:", crc_calculated, ",接收值:", crc_received)
return
end

-- 6. 解析寄存器数据(从第 4 字节开始,大端序)
local data1 = string.unpack(" >I2", resp, 4) -- 寄存器 0,偏移 4
local data2 = string.unpack(" >I2", resp, 6) -- 寄存器 1,偏移 6

-- 7. 记录数据
slave1_data[0] = data1
slave1_data[1] = data2

-- 8. 记录日志
log.info("exmodbus_test", "成功读取到从站 1 保持寄存器 0-1 的值,寄存器 0 数值为", slave1_data[0], ",寄存器 1 数值为", slave1_data[1])

elseif read_result.status == exmodbus.STATUS_TIMEOUT then
log.info("exmodbus_test", "未收到从站 1 的响应(超时)")
end

end

-- 定时任务函数:每 2 秒调用一次读取函数
local function task()
while true do
if rtu_master then
-- 每 2 秒调用一次读取函数
read_slave1_holding_registers()
else
log.info("exmodbus_test", "rtu_master 未创建,无法执行 read_slave1_holding_registers()")
end
sys.wait(2000)
end
end

-- 初始化任务
sys.taskInit(task)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!

以上为 485 总线硬件设计核心要点及 LuatOS 环境下 Modbus 协议应用的相关分享,内容涵盖 485 总线与 UART 的关系、电平匹配、TVS 防护以及 exmodbus 扩展库的优化内容,相关实操内容可供工程技术人员参考,用于解决实际应用中的相关问题。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 总线
    +关注

    关注

    10

    文章

    3055

    浏览量

    91856
  • 硬件设计
    +关注

    关注

    18

    文章

    492

    浏览量

    45684
  • LuatOS
    +关注

    关注

    0

    文章

    169

    浏览量

    2745
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    485 总线硬件设计:电平匹配、TVS 防护与 Modbus 应用

    总线硬件设计核心细节,包括其与 UART 的关联、电平匹配处理及不同防护等级的 TVS 器件选型;同时介绍 LuatOSexmodbus 扩展
    的头像 发表于 03-25 12:07 903次阅读
    <b class='flag-5'>485</b> <b class='flag-5'>总线</b><b class='flag-5'>硬件</b>设计:电平匹配、TVS 防护与 Modbus <b class='flag-5'>库</b>应用

    LuatOS框架的使用(上)

    在资源受限的物联网终端设备中,如何实现快速开发与稳定运行是关键挑战。LuatOS框架通过将Lua语言与底层硬件抽象层深度融合,提供了一套简洁高效的开发范式。本文将围绕
    的头像 发表于 01-27 19:38 323次阅读
    <b class='flag-5'>LuatOS</b>框架的使用(上)

    ADC模数转换实战硬件设计与软件开发要点指南!

    ADC硬件设计与软件开发的关键要点,为开发者提供ADC转换的实战指导。 本文将分享硬件参考设计及
    的头像 发表于 12-16 13:25 557次阅读
    ADC模数转换<b class='flag-5'>实战</b>:<b class='flag-5'>硬件</b>设计与软件<b class='flag-5'>开发</b><b class='flag-5'>要点</b>指南!

    构建可靠USB应用:硬件设计要点LuatOS开发技巧!

    指导。 本文以Air780EPM系列低功耗模组为例,分享USB接口的硬件设计要点以及LuatOS高效开发API,帮助开发者在设计中避开常见陷
    的头像 发表于 12-15 10:46 312次阅读
    构建可靠USB应用:<b class='flag-5'>硬件</b>设计<b class='flag-5'>要点</b>与<b class='flag-5'>LuatOS</b><b class='flag-5'>开发</b>技巧!

    LuatOS exgnss扩展实战进阶:GNSS功能开发全流程!

    GNSS功能开发涉及多环节协同,LuatOS exgnss扩展是其中的关键枢纽。本文以全流程探秘形式,从硬件准备、固件烧录到代码实现,详解exgnss
    的头像 发表于 11-14 15:24 6031次阅读
    <b class='flag-5'>LuatOS</b> exgnss扩展<b class='flag-5'>库</b><b class='flag-5'>实战</b>进阶:GNSS功能<b class='flag-5'>开发</b>全流程!

    LuatOS MCU核心全接触:新手操作与功能测试攻略!

    开启芯片级开发实战。 一、MCU核心库函数功能 MCU核心LuatOS中封装MCU一些特殊操作的核心模块,提供了对MCU底层功能的访问和控制能力,是
    的头像 发表于 11-12 14:30 380次阅读
    <b class='flag-5'>LuatOS</b> MCU核心<b class='flag-5'>库</b>全接触:新手操作与功能测试攻略!

    USB设计操作指南:硬件关键与LuatOS API开发技巧!

    本文以Air780EPM系列低功耗模组为实例,分享USB接口硬件设计的要点以及LuatOS高效开发API的助力作用。旨在指导开发者在设计中规
    的头像 发表于 11-11 18:29 346次阅读
    USB设计操作指南:<b class='flag-5'>硬件</b>关键与<b class='flag-5'>LuatOS</b> API<b class='flag-5'>开发</b>技巧!

    LuatOS AGPS 辅助定位开发实战教程

    为解决传统 GPS 定位慢、功耗高的痛点,AGPS 技术通过辅助数据注入提升效率。本教程以 LuatOS 开发环境为基础,循序渐进地讲解 AGPS 辅助定位的开发流程,包括 AGPS 服务器对接
    的头像 发表于 10-31 17:34 1327次阅读
    <b class='flag-5'>LuatOS</b> AGPS 辅助定位<b class='flag-5'>开发</b><b class='flag-5'>实战</b>教程

    无需硬件LuatOS模拟器释放开发无限可能

    LuatOS PC模拟器以创新技术打破硬件限制,开发者无需购置专用设备,仅凭PC即可完成全流程开发。高效模拟内核确保运行稳定性,让创意不受硬件
    的头像 发表于 09-18 13:57 653次阅读
    无需<b class='flag-5'>硬件</b>,<b class='flag-5'>LuatOS</b>模拟器释放<b class='flag-5'>开发</b>无限可能

    告别硬件负担,LuatOS模拟器重塑开发成本与效率

     LuatOS PC模拟器以“零硬件依赖”为核心优势,显著降低开发成本与时间消耗。开发者无需为设备兼容性发愁,即可在模拟环境中高效完成项目开发
    的头像 发表于 09-15 17:18 858次阅读
    告别<b class='flag-5'>硬件</b>负担,<b class='flag-5'>LuatOS</b>模拟器重塑<b class='flag-5'>开发</b>成本与效率

    SFUD驱动实战手册:串行SPI Flash开发全流程解析

    统一接口实现跨硬件兼容,从而降低嵌入式系统的开发复杂度,提高软件的可重用性和可扩展性。 LuatOS开发
    的头像 发表于 07-29 13:19 838次阅读
    SFUD驱动<b class='flag-5'>库</b><b class='flag-5'>实战</b>手册:串行SPI Flash<b class='flag-5'>开发</b>全流程解析

    零基础学习LuatOS编程:快速上手开发实战教程!

    无论你是刚接触物联网编程的新手,还是希望拓展技能的技术爱好者,本教程将为零基础的读者提供一条清晰的LuatOS学习路径。从安装开发工具到编写第一个程序,我们将通过实例讲解核心概念,助你快速实现从理论
    的头像 发表于 06-13 17:27 732次阅读
    零基础学习<b class='flag-5'>LuatOS</b>编程:快速上手<b class='flag-5'>开发</b><b class='flag-5'>实战</b>教程!

    快速入门——LuatOS:sys多任务管理实战攻略!

    在嵌入式开发中,多任务管理是提升系统效率的关键。本教程专为快速入门设计,聚焦LuatOS的sys,通过实战案例带你快速掌握多任务创建、调度与同步技巧。无论你是零基础新手还是希望快速提
    的头像 发表于 05-29 14:36 987次阅读
    快速入门——<b class='flag-5'>LuatOS</b>:sys<b class='flag-5'>库</b>多任务管理<b class='flag-5'>实战</b>攻略!

    全栈开发进阶指南:LuatOS-log从入门到实战

    本文将带你深入探索LuatOS系统中log的核心原理与实战技巧,通过代码示例解析日志管理、错误追踪及性能优化的最佳实践,助力全栈工程师构建更稳健的物联网应用。 今天,我们一起来认识LuatO
    的头像 发表于 05-15 16:12 2993次阅读
    全栈<b class='flag-5'>开发</b>进阶指南:<b class='flag-5'>LuatOS</b>-log<b class='flag-5'>库</b>从入门到<b class='flag-5'>实战</b>!

    解锁LuatOS-log:全栈工程师的日志管理实战课!

    针对全栈开发者设计的实战教程,本文聚焦LuatOS平台log的高效使用,从基础配置到高级调试策略,手把手教你搭建可扩展的日志系统,提升项目维护效率。 今天,我们一起来认识
    的头像 发表于 05-12 15:23 1623次阅读
    解锁<b class='flag-5'>LuatOS</b>-log<b class='flag-5'>库</b>:全栈工程师的日志管理<b class='flag-5'>实战</b>课!