LLCOM 详细使用教程
概述
LLCOM 是一款基于 C# WPF (.NET Framework) 开发的、内置 Lua 脚本引擎 的高自由度串口调试工具,由 chenxuuu 开发维护。核心亮点是通过 Lua 脚本实现完全可编程的收发逻辑、自动应答、协议解析与自动化测试。遵循 Apache-2.0 许可证。
- 项目地址:https://github.com/chenxuuu/llcom
- 当前版本:1.1.3.9
- 运行平台:Windows
- 部署方式:单文件 `llcom.exe`,双击即运行
- 技术栈:C# WPF + Lua(NLua/MoonSharp 托管 Lua 运行时)
快速开始
1. 直接运行
双击 llcom.exe
首次运行在同目录生成 `config.json`(串口参数/窗口状态/脚本列表)。
2. 命令行启动
llcom.exe --script=auto.lua --port=COM3 --baud=115200
3. 连接串口
- 启动程序后,选择 COM 端口(自动枚举)
- 设置 波特率(300~921600)
- 配置数据位/停止位/校验/流控
- 点击 打开串口
核心功能详解
通用串口收发基础
- 编码模式:HEX / 文本(ASCII/UTF-8)切换
- 显示增强:时间戳(精度可配)、发送/接收分色、行号、字节计数
- 串口参数:波特率(300~921600)、数据位/停止位/校验/流控全可配、自动枚举/刷新
- 日志保存:自动/手动保存收发记录到文本文件,支持按大小/时间分卷
Lua 脚本引擎(核心功能)
脚本上下文 API
-- 串口操作
serial.open(portName, baudrate, parity, dataBits, stopBits)
serial.close()
serial.write(bytes) -- 发送字节表 {0x01, 0x03, ...}
serial.writeHex("01 03 00 00") -- 发送 HEX 字符串
serial.read(timeoutMs) -- 读取返回字节表
serial.onData = function(data) ... end -- 接收回调
-- 协议辅助
crc16.modbus(bytes) -- 返回 CRC16-Modbus 校验码
crc32.ieee(bytes)
bit.band/bor/bxor/lshift/rshift -- 位运算库
struct.pack/unpack(fmt, ...) -- 打包/解包 (如 ">HHf")
-- 界面/日志
log.info/warn/error(msg)
ui.setStatus(text)
ui.addChartPoint(seriesName, value)
ui.exportCsv(filename, dataTable)
-- 定时/延时
timer.setTimeout(ms, callback)
timer.setInterval(ms, callback)
timer.clear(id)
-- 持久化配置
config.set(key, value)
config.get(key, default)
脚本管理
- 多标签页编辑器:语法高亮/行号/括号匹配
- 运行/暂停/停止/单步调试(基础)
- 输出控制台、错误堆栈定位
- 自动加载:启动时可指定默认脚本自动运行
- 热重载:修改脚本保存后可点击"重载"无需重启
典型脚本应用场景
| 场景 |
脚本实现要点 |
| 自定义协议自动应答 |
帧头/长度/校验解析 → 根据命令字分发 → 动态构造响应帧 → 延时发送 |
| 压力/自动化测试 |
循环发送测试帧 → 统计成功率/延迟 → 生成 CSV 报告 → 断言判定 PASS/FAIL |
| 数据预处理/转发 |
接收原始帧 → 解密/解压/校验 → 重新编码 → 转发至 TCP/MQTT/HTTP |
| 协议逆向辅助 |
捕获收发 → 标注字段 → 导出结构化 JSON → 辅助人工分析 |
串口监控组件
项目源码另附 `serial_monitor_rs`(Rust 实现)与 Web 适配层,提供高性能串口抓包/过滤/导出能力,可独立集成到其他工具。
配置说明
config.json 配置文件
首次运行后生成 `config.json`,包含:
- 串口参数(端口/波特率/校验等)
- 窗口状态(位置/大小/编码模式)
- 脚本列表(自动加载的脚本路径)
脚本文件管理
- 建议将脚本文件放在 `scripts/` 子目录
- 支持相对路径引用
- 可在启动参数中指定默认脚本
键盘快捷键
| 快捷键 |
功能 |
| `Ctrl+C` |
关闭串口 |
| `Ctrl+S` |
发送数据 |
| `Ctrl+Shift+S` |
保存脚本 |
| `F5` |
运行/停止脚本 |
| `F6` |
重载脚本(热重载) |
| `Ctrl+L` |
清空接收区 |
| `Ctrl+F` |
搜索/过滤 |
| `F1` |
帮助 |
| `Alt+1` ~ `Alt+9` |
切换到脚本标签页 |
常用操作流程
场景一:自定义协议自动应答
- 编写 Lua 脚本,定义 `serial.onData` 回调函数
- 在回调中解析帧头/长度/校验
- 根据命令字构造响应帧
- 使用 `serial.write()` 发送响应
- 保存脚本,设置启动自动加载
- 打开串口,脚本自动运行
场景二:Modbus RTU 从站仿真
- 编写 Lua 脚本实现 Modbus 从站逻辑
- 使用 `crc16.modbus()` 计算校验
- 解析功能码 0x03(读寄存器)、0x06(写单个寄存器)、0x10(写多个寄存器)
- 查表返回数据,构造响应帧
- 设置串口参数(与主站一致)
- 启动脚本,仿真从站运行
场景三:自动化压力测试
- 编写测试脚本,循环发送测试帧
- 使用 `timer.setInterval()` 设置发送间隔
- 统计响应时间和成功率
- 使用 `ui.exportCsv()` 导出报告
- 添加断言逻辑判断 PASS/FAIL
场景四:数据转发
- 编写脚本接收串口数据
- 解析、解密/解压/校验
- 重新编码为目标格式
- 通过 TCP/MQTT/HTTP 转发
- 使用 `log.info()` 记录日志
故障排查
| 现象 |
可能原因 |
解决方案 |
| Lua 脚本报错 |
脚本语法错误/API 调用错误 |
查看输出控制台的错误堆栈 |
| 串口无法打开 |
端口被占用/权限不足 |
关闭其他占用程序,以管理员运行 |
| 脚本热重载失败 |
文件被其他程序锁定 |
关闭脚本文件编辑器后重试 |
| 内存泄漏 |
脚本中未释放对象/循环引用 |
检查 `serial.close()` 调用,优化脚本逻辑 |
| 接收数据不完整 |
超时设置过短 |
调整 `serial.read()` 超时参数 |
| CRC 校验失败 |
字节顺序/算法选择错误 |
确认使用正确的 CRC 算法 |
适用场景
| 场景 |
优势 |
| 设备从站仿真 |
无需写 C# 服务端,几十行 Lua 实现完整状态机 |
| 自动化回归测试 |
脚本驱动全流程,CI/CD 集成友好 |
| 现场运维应急 |
单文件、无安装、U 盘带走、脚本随身携带 |
| 教学/原型开发 |
可视化串口+可编程逻辑,降低上手门槛 |
注意事项
- 脚本安全:Lua 运行时为沙箱隔离,禁止危险 OS 调用
- 单文件运行:`llcom.exe` 为单文件,无需安装其他依赖
- 脚本目录:建议将脚本文件放在 `scripts/` 子目录中管理
- 配置持久化:程序自动保存 `config.json`,关闭后下次启动恢复上次设置