给串口装上大脑:LLCOM Lua脚本Debug Tools

freefree技术Resources

这篇内容可直接阅读,适合用于基础学习和Search引流。

给串口装上大脑:LLCOM Lua脚本Debug Tools缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 一、LLCOM 是什么
  2. 2. 二、安装与Download
  3. 3. 三、Function清单:比普通串口Assistant多了什么
  4. 4. 四、两大核心Function详解
  5. 5. 4.1 send前 Lua 处理
  6. 6. 4.2 独立 Lua 脚本运行区
  7. 7. 五、核心 API 速查
  8. 8. 5.1 串口收发 API
  9. 9. 5.2 定时器与协程 API
  10. 10. 5.3 字符串处理 API
  11. 11. 5.4 日志 API
  12. 12. 六、Modbus RTU 实战脚本
  13. 13. 6.1 智能send:自动计算 Modbus CRC 并send
  14. 14. 6.2 Modbus RTU 自动轮询脚本
  15. 15. 6.3 多从站扫描器
  16. 16. 6.4 Response帧自动Parse + dataexport
  17. 17. 七、TCP / MQTT / 监听 —— 其他 Modbus Scene
  18. 18. 7.1 调 Modbus TCP
  19. 19. 7.2 MQTT 测试
  20. 20. 7.3 串口监听
  21. 21. 八、和同类Tools的对比
  22. 22. 九、Frequently Asked Questions
  23. 23. 给串口装上大脑:LLCOM Lua脚本Debug Tools

来源:Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区

本文:LLCOM:给串口装上 Lua 大脑 —— Modbus debug效率翻倍的完整指南 · Author:modbus技术团队 · 发布于 2026-07-01

摘要:LLCOM 是 GitHub 开源的 Windows 串口Debug Tools(chenxuuu/llcom),基于 .NET 和腾讯 xlua 引擎,让Serial Port Debugging不再是手动一条条发hexadecimal帧。其核心杀手锏是在标准串口Tools基础上内嵌了完整的 Lua 5.3 运行环境,支持合宙 Luat Task 协程框架,可以写脚本自动收发、自动计算 Modbus CRC、自动轮询、自动ParseResponse。本文从安装到 API 参考到四个 Modbus 实战脚本,覆盖你从Download到跑通自动化测试的每一个步骤。关键词:LLCOM、Lua Serial Port Debugging、Modbus CRC 自动计算、串口自动化测试、xlua、Luat Task。


debug Modbus RTU 设备最常见的工作流是:Open the serial portTools → manual inputhexadecimal帧 → 点send → 等回应 → 肉眼对照byte → 发现 CRC 算错了 → 重新来。十台设备调完,手指痛、眼睛酸、心里碎成渣。

LLCOM 解决的就是这个问题。它不只是一个串口Assistant——它是个能跑脚本的Serial Port Debugging引擎。


一、LLCOM 是什么

LLCOM 是 GitHub 开源项目(chenxuuu/llcom),用 C# 写、基于 .NET 框架,采用腾讯 xlua 作为脚本引擎。许可证是 Apache 2.0。

定位一句话:可编程的串口Debug Tools。普通的串口Assistant只能「键盘打hexadecimal→手点send→肉眼看出hexadecimal」。LLCOM 可以写 Lua 脚本让data自动处理、自动send、自动Parse、自动校验。

核心架构三层:

  • 串口收发层:标准串口通信,支持Baud rate、data bit、check digit配置,同时集成 TCP/UDP/MQTT 客户端和服务器Function,还能监听其他程序使用的串口
  • Lua 脚本引擎层:Lua 5.3 环境 + 合宙 Luat Task 协程框架(sys.wait、sys.taskInit、sys.timerLoopStart 等All移植)
  • send前处理层:用户在send框中输入的data,可以经过一段 Lua 脚本处理后再发出去——自动换行、自动转 Hex、自动组装 JSON,什么都能干

开源address:https://github.com/chenxuuu/llcom


二、安装与Download

三个官方渠道,选一个:

方式一:微软商店 在 Windows 自带的 Microsoft Store 中Search「LLCOM」即可安装。优势是自动更新,缺点是需要微软账号。

方式二:便携版(免安装) 从 底部 Download zip 包,解压到任意目录,双击 llcom.exe 运行。不上Register表、不写system目录,放到 U 盘里到处带着跑。

方式三:GitHub Releases 从 https://github.com/chenxuuu/llcom/releases/latest Download最新稳定版。适合需要特定版本的debugScene。

system要求:Windows 10 及以上,64 位。需要 .NET Runtime(Windows 10/11 通常已内置;如果提示缺少 .NET Runtime,从微软官网Download .NET Desktop Runtime 8.0 即可)。


三、Function清单:比普通串口Assistant多了什么

LLCOM 有普通串口Assistant的所有Function(串口选择、Baud rate/check digit配置、hexadecimal/ASCII 收发、日志显示),然后加了这些:

Function说明Modbus debugScene
Lua send前处理输入框内容经过 Lua 脚本处理后才send自动拼接 CRC、自动加slave address
独立 Lua 脚本区右侧可跑完整的 Lua 脚本,带定时器和协程写一个脚本自动轮询所有从站register
快捷send栏(10 页×不限条数)保存常用命令,一键send把读不同register的帧放不同页
串口监听监控其他程序正在使用的serial data 看某上位机软件发了什么帧
TCP/UDP/SSL 客户端和服务端可以不通过串口直接调 TCP测试 Modbus TCP 端口
MQTT 测试集成 MQTT 发布/订阅验证网关的 MQTT 上行
串口自动重连断开后自动恢复connect设备断电重启不会断debug
自动日志保存带time戳的串口和 Lua 日志调完All设备,回头看日志复盘
Coding互转/乱码恢复GBK/UTF-8/Hex 之间转换中文字符串debug

四、两大核心Function详解

4.1 send前 Lua 处理

这是 LLCOM 最直接提效的Function。在「send设置」→「send处理脚本」里写一段 Lua,每次点send时,你输入框里的原始Text先传给这段脚本,脚本处理后返回的字符串才是真正发到串口的data。

三个经典用法:

自动加 rn:很多串口设备要求命令以回车换行结尾——

return uartData .. "rn"

从此不用每次手打 0D 0A,输入命令直接点send就完事。

hexadecimal自动转换:在输入框里写hexadecimal字符串(如 010300000001),脚本自动转成binary——

return uartData:fromHex()

这是 Modbus RTU debug的标配——你在输入框写 Modbus 帧的hexadecimal表示,脚本转成binary发给设备。

JSON 自动组装:输入 a,b,c,发出去的是 JSON——

json = require("JSON")
t = uartData:split(",")
return json:encode({
    key1 = t[1],
    key2 = t[2],
    key3 = t[3],
})

快捷send栏的每个button也同样走这个脚本,所以你可以建 10 页快捷send,每页放不同的 Modbus 命令,然后每次点button自动加 CRC 发出去——后面会给出完整实现。

4.2 独立 Lua 脚本运行区

右边有个「Lua 脚本」区域,你可以直接写完整的 Lua 程序并运行。这里的脚本拥有合宙 Luat Task 框架的All能力:

  • sys.taskInit() 创建协程任务
  • sys.wait(ms) 延时等待(不阻塞界面)
  • sys.waitUntil() 等待消息(事件驱动)
  • sys.timerLoopStart() 循环定时器
  • sys.publish() / sys.subscribe() 消息发布订阅

基础示例:收到serial data 后自动回复——

uartReceive = function (data)
    log.info("uartReceive", data)
    sys.publish("UART", data)
end

sys.taskInit(function()
    while true do
        local _, udata = sys.waitUntil("UART")
        log.info("task waitUntil", udata)
        local sendResult = apiSendUartData("ok!")
        log.info("uart send", sendResult)
    end
end)

你甚至可以用 xlua 直接调用 C# 的 System.Net 类库发 HTTP Request——这意味着你可以写一个脚本,串口收到data后自动往Cloud Platform推一条消息。


五、核心 API 速查

LLCOM 的 Lua API Document位于 https://github.com/chenxuuu/llcom/blob/master/LuaApi.md ,这里列出 Modbus debug最常用的部分。

5.1 串口收发 API

-- senddata到串口(推荐新接口)
apiSend("uart", data)

-- senddata到串口(旧接口,后续会Remove)
apiSendUartData(data)

-- 订阅串口receive回调
apiSetCb("uart", function(data)
    log.info("received", data)
end)

-- Cancel订阅
apiUnsetCb("uart", callback)

5.2 定时器与协程 API

-- 创建任务
sys.taskInit(function()
    while true do
        -- 你的逻辑
        sys.wait(1000)  -- 等 1000ms
    end
end)

-- 循环定时器
sys.timerLoopStart(function()
    log.info("tick", os.time())
end, 1000)  -- 每 1000ms 触发一次

-- 停止定时器
sys.timerStop(timerId)

5.3 字符串处理 API

-- binary转hexadecimal字符串
string.toHex("x01x03")  -- 返回 "0103"

-- hexadecimal字符串转binary
("010300000001"):fromHex()

-- 分割字符串
("a,b,c"):split(",")  -- 返回 {"a","b","c"}

5.4 日志 API

log.info("tag", "message")
log.warn("tag", "warning")
log.error("tag", "error")

所有日志自动保存到软件目录,并附带time戳。


六、Modbus RTU 实战脚本

以下脚本可以直接Copy到 LLCOM 里运行。每个都是完整可用的。

6.1 智能send:自动计算 Modbus CRC 并send

Tired of 手动算 CRC?这是 LLCOM 在 Modbus debug中最经典的应用。

在「send处理脚本」中粘贴:

-- Modbus CRC16 查表法(多项式 0xA001)
local crcTable = {}
for i = 0, 255 do
    local crc = i
    for _ = 1, 8 do
        if (crc & 1) ~= 0 then
            crc = (crc >> 1) ~ 0xA001
        else
            crc = crc >> 1
        end
    end
    crcTable[i] = crc
end

local function modbusCrc16(data)
    local crc = 0xFFFF
    for i = 1, #data do
        local b = string.byte(data, i)
        crc = (crc >> 8) ~ crcTable[(crc ~ b) & 0xFF]
    end
    return crc
end

-- 主逻辑:把输入转成binary,计算 CRC,拼上去,发给串口
local raw = uartData:fromHex()  -- 输入框写hexadecimal,如 010300000001
local crc = modbusCrc16(raw)
local lo = crc & 0xFF
local hi = (crc >> 8) & 0xFF
return raw .. string.char(lo, hi)

现在你在输入框写 010300000001(slave address=01,function code=03,starting address=0000,register数=0001),点send后实际发出去的是 01 03 00 00 00 01 84 0A——CRC 自动接在后面。

6.2 Modbus RTU 自动轮询脚本

跑在「Lua 脚本」区域中,每隔 2 秒读一次从站 01 的保持register 40001(address 0x0000),自动Parse返回data:

-- CRC 表(同上,这里省略,需要放在脚本最前面)
-- ...(和 6.1 的 crcTable 和 modbusCrc16 函数一样)

local function buildReadFrame(slave, startAddr, regCount)
    local frame = string.char(slave, 0x03,
        (startAddr >> 8) & 0xFF, startAddr & 0xFF,
        (regCount >> 8) & 0xFF, regCount & 0xFF)
    local crc = modbusCrc16(frame)
    return frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)
end

local function parseResponse(data)
    if #data < 5 then
        log.warn("modbus", "Response太短: " .. string.toHex(data))
        return nil
    end
    local slave = string.byte(data, 1)
    local func = string.byte(data, 2)
    if func > 0x80 then
        log.error("modbus", "Exception Code: 0x" .. string.format("%02X", string.byte(data, 3)))
        return nil
    end
    local byteCount = string.byte(data, 3)
    local values = {}
    for i = 0, (byteCount / 2) - 1 do
        local hi = string.byte(data, 4 + i * 2)
        local lo = string.byte(data, 5 + i * 2)
        values[i + 1] = (hi << 8) | lo
    end
    return {slave = slave, values = values}
end

-- receive处理
apiSetCb("uart", function(data)
    local result = parseResponse(data)
    if result then
        log.info("modbus", string.format("从站%02X register value: %s",
            result.slave, table.concat(result.values, ", ")))
    end
end)

-- 轮询任务
sys.taskInit(function()
    while true do
        local frame = buildReadFrame(0x01, 0x0000, 4)
        log.info("modbus", "send: " .. string.toHex(frame))
        apiSend("uart", frame)
        sys.wait(2000)
    end
end)

运行后日志输出类似:modbus send: 0103000000044409modbus 从站01 register value: 168, 2234, 0, 512。不需要人工干预,脚本自动轮询、自动Parse、自动打日志。

6.3 多从站扫描器

自动扫描总线上有哪些从站在线。挨个发读取命令,有Response的就是在线:

-- CRC 函数同上,省略

local function scanSlave(slaveId)
    local frame = string.char(slaveId, 0x03, 0x00, 0x00, 0x00, 0x01)
    local crc = modbusCrc16(frame)
    frame = frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF)

    apiSetCb("uart", function(data)
        if #data >= 5 and string.byte(data, 1) == slaveId
            and string.byte(data, 2) == 0x03 then
            log.info("scan", "从站 " .. slaveId .. " 在线✓")
        end
    end)

    apiSend("uart", frame)
    log.info("scan", "扫描从站 " .. slaveId .. " ...")
end

sys.taskInit(function()
    for slaveId = 1, 247 do
        scanSlave(slaveId)
        sys.wait(150)  -- 等 150ms 给从站Responsetime
    end
    log.info("scan", "扫描Complete")
end)

脚本跑完,日志里列出所有在线的slave address。大型项目中第一次上电后跑一遍这个,省去挨个看说明书的功夫。

6.4 Response帧自动Parse + dataexport

收到 Modbus Response后,自动Parse并format化为 CSV 行,方便Copy到 Excel 做趋势分析:

local results = {}

apiSetCb("uart", function(data)
    if #data < 5 then return end
    local slave = string.byte(data, 1)
    local func = string.byte(data, 2)
    if func >= 0x80 then
        log.error("modbus", string.format("S=%02X Exception Code0x%02X", slave, string.byte(data, 3)))
        return
    end
    local byteCount = string.byte(data, 3)
    local row = {os.date("%H:%M:%S"), slave}
    for i = 0, (byteCount / 2) - 1 do
        local hi = string.byte(data, 4 + i * 2)
        local lo = string.byte(data, 5 + i * 2)
        table.insert(row, (hi << 8) | lo)
    end
    table.insert(results, table.concat(row, ","))
    log.info("csv", table.concat(row, ","))
end)

-- 轮询任务(每 5 秒采集一次,共采集 60 次 = 5 分钟)
sys.taskInit(function()
    for i = 1, 60 do
        local frame = string.char(0x01, 0x03, 0x00, 0x00, 0x00, 0x04)
        local crc = modbusCrc16(frame)
        apiSend("uart", frame .. string.char(crc & 0xFF, (crc >> 8) & 0xFF))
        sys.wait(5000)
    end
    log.info("export", "采集Complete,共 " .. #results .. " 行")
end)

日志输出的每一行都可以直接Copy粘贴到 CSV 文件里用 Excel 打开。


七、TCP / MQTT / 监听 —— 其他 Modbus Scene

7.1 调 Modbus TCP

LLCOM 可以当 TCP 客户端connect Modbus TCP 设备(默认端口 502)。打开 TCP 客户端Function,填入设备 IP 和端口 502,connect成功后像串口一样收发—— Modbus TCP 帧和 RTU 帧的区别只是少了 CRC、多了 MBAP 头(6 byte)。你可以在send处理脚本里自动补上 MBAP 头:

-- 输入框写 000000000006010300000001
-- 表示:事务ID=0000,协议ID=0000,Length=0006,单元ID=01,function code=03,starting address=0000,register数=0001
return uartData:fromHex()

或者脚本接到串口收到的 RTU 帧,去掉 CRC 换成 MBAP 头后通过 TCP 通道发出去。具体见软件自带的 channel-demo.lua 例子。

7.2 MQTT 测试

如果debug Modbus 网关(DTU 把serial data 转成 MQTT 发布),LLCOM 的 MQTT Function可以直接订阅网关发布的主题,看到网关发上来的data是否正确。还能往控制主题发布消息测试下行。

7.3 串口监听

「串口监听」Function可以抓取其他软件正在使用的串口通信——比如你的上位机软件在跟设备通信,你不想停掉它但想看它发了什么帧。LLCOM 可以静默抓取serial data 并显示日志,不影响原来的通信。


八、和同类Tools的对比

Tools脚本支持Modbus CRC开源价格
LLCOMLua 5.3 + xlua + 协程框架需要自己写(本文已提供)free
SSCOM不支持free
COMTool有限不支持free
Modbus Poll无(专业 Modbus 固定Function)内置$129
ModScan内置$69

LLCOM 不是「开箱即用」的 Modbus 专用Tools,它是「可以变成 Modbus 专用Tools的万能Tools」。如果你只需要点一个button就发 Modbus 帧,Modbus Poll 更直接。但如果你需要批量自动化测试、CustomizationParse、dataexport、和 MQTT/TCP 联调——LLCOM 是目前开源Tools里最灵活的。


九、Frequently Asked Questions

Q: 收到乱码怎么办? 检查Baud rate、check digit是否和设备一致。然后在 LLCOM 的receive区Switch Hex 显示——很多情况下「乱码」是因为设备返回的是binarydata但显示区按 ASCII Parse了。

Q: CRC 脚本发出去的帧设备没反应? 第一步:Confirm A/B 线没接反。第二步:在receive区看设备有没有返回任何byte——如果完全没有,可能是Device address不对。第三步:如果设备返回了data但是Exception Code(function code + 0x80),看Exception Code是什么——0x02 是「Illegal data address」,register address可能does not exist。

Q: 快捷send栏的button能自动跑 CRC 脚本吗? 能。快捷send栏的内容也会经过「send处理脚本」——所以你写好了 CRC 自动计算脚本后,快捷send栏只需要填裸帧(如 010300000001),点button自动加 CRC。

Q: Lua 脚本运行时报错了? 在脚本区域最开头加一行 log.info("boot", "script started") 看脚本是否成功启动。大部分Error是因为变量名拼错或调用了does not exist的 API——日志区会显示 Lua Error信息。


LLCOM 的核心价值不是多了多少Function,而是把「debug」从重复体力劳动变成了可编程的任务。你在现场花半小时写了三个脚本,接下来三天点几下鼠标data自己就来了。这就是「给串口装上大脑」的真正含义——不是 LLCOM 有 AI,是 LLCOM 让你能把自己的debug逻辑写成代码、然后让软件替你跑。

有问题再聊。

给串口装上大脑:LLCOM Lua脚本Debug Tools

资源价格 ¥0.00 销售quantity 0 Published 2025年12月22日 更新time 2026年7月1日
已经回复?refresh
技术术语(共 9 个)—— 点击展开
Modbus RTU基于串行链路的Modbus协议,使用binaryCoding和CRC check
Modbus TCP基于以太网的Modbus协议变体,使用TCP/IP传输
function codeModbusfunction code指定读/写OperationType,如01读线圈、03读保持register
registerModbus register存储data单元,分线圈/离散输入/保持/输入register四类
Baud rate串行通信每秒传输符号数,Modbus RTU常用9600/19200
DTUdata传输单元,将serial data 转为网络data实现远程通信
网关协议转换设备,如 Modbus RTU ↔ Modbus TCP
串口计算机与外部设备进行串行通信的物理接口
保持registerModbus 16位可读写data,address从40001开始
来源/Tools信息 —— 点击展开
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区 Category Modbus DebuggingTools 字数 8418 字 · 阅读约 22 分钟 更新 2026-07-01 永久链接 https://www.modbus.cn/37716.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus DebuggingTools,支持 Modbus RTU/TCP 实时通信debug、register读写、线圈控制、data监控和message分析。 无需安装,微信Search「Modbus DebuggingAssistant」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
RelatedTags
把这篇Resources用于真实项目?

进入Tools中心进行messageParse、CRC verification和设备debug,或Submit requirements获取选型与接入建议。

工程师member

把这篇文章变成可执行的debugResources

开通后可使用高级messageParse、Resources包Download、Code Example、工程案例和优先Technical Support,适合真实项目交付。

高级Tools不限次
Resources包与代码包
Complete Engineering Case Library
优先Technical Support入口

发表回复

您的邮箱address不会被公开。 必填项已用 * 标注