COMTool: An Elegant and Efficient Cross Platform Serial Debugging Assistant

member专享member专享

该内容已接入现有member/付费system,解锁后可View完整Resources或Download附件。

COMTool: An Elegant and Efficient Cross Platform Serial Debugging Assistant缩略图

Source: Modbus Chinese Network (modbus. cn) - a leading Modbus communication protocol technology community in China

Using an intermediate script as a bridge: Python script reads Modbus response through pyserial → parses temperature/humidity → outputs to virtual serial port in ASCII waveform format of COMTool → COMTool's Graph plugin directly displays the curve.

摘要:COMTool(GitHub: Neutree/COMTool,LGPL-3.0)是用 Python 3 + PyQt5 写的开源串口调试工具,支持 Windows、Linux、macOS 和树莓派。对 Modbus 调试场景来说,它有三个差异化价值:真正的全平台一致性体验、协议插件系统(Python 自定义编解码/解析)、内置实时波形图表(传感器数据可视化)。本文不铺功能清单,直接从 Modbus 工程师的实际需求出发,告诉你 COMTool 能解决哪些问题、在哪几个场景下比 ATK-XCOM 和 LLCOM 更适合。关键词:COMTool、跨平台串口调试、Python 串口工具、Modbus 波形显示、协议插件。


搞 Modbus 调试的人,大多数时候趴在 Windows 上干活——毕竟 SIEMENS、三菱、欧姆龙的组态软件和编程工具基本只跑 Windows。但有那么几个场景,你会突然发现自己需要的串口助手在 Windows 上根本没有,或者有了但体验一塌糊涂:

场景一:你用的是 MacBook Pro 作为主力开发机,但 USB 转 485 插上去,要调一个 Modbus 传感器。打开虚拟机跑 Windows 版本的工具——串口透传延迟高三倍,偶尔丢帧。

场景二:你的网关跑在 Ubuntu Server 上,现场只有一台树莓派可以插串口。你想直接在树莓派桌面环境上开个串口助手抓数据——绝大部分 Windows 工具直接没法用。

场景三:你在调一个温湿度传感器,Modbus 返回的是原始寄存器值(比如 168 代表 16.8°C),你需要在接收区直接看到温度曲线而非一堆十六进制数字。

这三个场景,就是 COMTool 存在的理由。

COMTool 是 GitHub 开源项目(Neutree/COMTool),MIT 协议,用 Python 3 + PyQt5 写的。GitHub 上有 2000+ Star,核心维护者是 Neutree。它不是功能最全的串口工具,也不是 Modbus 专用工具——但它是目前跨平台做得最彻底的串口工具中,插件和可视化能力最强的一个。


一、COMTool 的跨平台到底「跨」了哪些

不像某些工具「理论支持 Linux 但实际装不起来」,COMTool 对每个平台都有独立的打包和安装方案:

Windows:从 GitHub Releases 下载 zip 包解压直接运行 comtool.exe。也可以通过 Scoop(Windows 包管理器)安装:scoop bucket add Nightly ... && scoop install comtool

macOS:dmg 安装包直接安装。因为是 Python + PyQt5 写的,系统自带 Python 3 即可。注意首次打开时因为未签名,需要在「系统偏好设置→安全性与隐私」中允许运行。如果想多开窗口,终端执行 open -n /Application/comtool.app

Linux:这是 COMTool 的优势场。Ubuntu 系有预编译二进制,Arch 系可以从 AUR 安装(yay -S python-comtool)。也可以用 pip 从源码安装:pip install comtool。树莓派需要先装依赖 sudo apt install git python3-pyqt5 python3-numpy,再 pip install。

树莓派:完整支持。插上 USB 转 485 模块、通电、打开 COMTool、选 /dev/ttyUSB0——和 Windows 上一样的操作逻辑。

所有平台上体验一致:同一个 PyQt5 界面、同一个插件系统、同一个配置文件格式。你可以在 Windows 上写好协议插件,拷贝到树莓派的 COMTool 插件目录下直接加载。


二、协议插件 —— COMTool 对 Modbus 调试最有价值的功能

2.1 协议插件解决什么问题

普通的串口助手是这样的:你发十六进制 010300000001840A,设备回 01030201988432,你用肉眼在回应的字节里找「0103」、确认从站地址是对的、跳过去看数据字节在哪、再手算一下 CRC。

COMTool 的协议插件(Protocol Plugin)可以让你定义收发两端的数据处理逻辑:发送前把「用户友好的输入」(比如「读温度传感器」)自动转成 Modbus RTU 帧;接收后把原始十六进制帧自动解析为「传感器值: 25.3°C」。全程不需要手看十六进制。

原理很简单。每个协议插件是一个 Python 类,必须实现两个核心方法:encode()decode()

encode() 的作用是把用户输入转成要发送的原始字节。decode() 的作用是把接收到的原始字节转成用户可读的显示格式。

2.2 一个最简的 Modbus 协议插件示例

以下插件让你在 COMTool 的「Protocol」模式下,发「读寄存器 地址0 数量4」这样的自然语言命令,自动拼成 Modbus RTU 帧发送。接收到的二进制响应自动解析为「从站01: [168, 2234, 0, 512]」。

class Plugin(Plugin_Base):
    id = "modbus_rtu"
    name = "Modbus RTU 解析器"
    version = "1.0"

    # CRC16 查表(Modbus 多项式 0xA001)
    _crc_table = None

    @classmethod
    def _build_crc_table(cls):
        if cls._crc_table:
            return cls._crc_table
        table = []
        for i in range(256):
            crc = i
            for _ in range(8):
                if crc & 1:
                    crc = (crc >> 1) ^ 0xA001
                else:
                    crc >>= 1
            table.append(crc)
        cls._crc_table = table
        return table

    @classmethod
    def _crc16(cls, data: bytes) -> int:
        table = cls._build_crc_table()
        crc = 0xFFFF
        for b in data:
            crc = (crc >> 8) ^ table[(crc ^ b) & 0xFF]
        return crc

    def encode(self) -> bytes:
        """用户输入 '读寄存器 地址0 数量4' → 拼成 Modbus RTU 帧"""
        text = self.sendEdit.toPlainText().strip()
        # 简化解析:固定从站地址 0x01
        slave = 0x01
        # 默认读保持寄存器(功能码 0x03),起始地址 0,数量 1
        _, addr_str, count_str = text.split()
        addr = int(addr_str.replace('地址', ''))
        count = int(count_str.replace('数量', ''))
        frame = bytes([slave, 0x03,
                       (addr >> 8) & 0xFF, addr & 0xFF,
                       (count >> 8) & 0xFF, count & 0xFF])
        crc = self._crc16(frame)
        return frame + bytes([crc & 0xFF, (crc >> 8) & 0xFF])

    def decode(self, data: bytes) -> str:
        """收到的 Modbus 响应帧 → 解析为人可读的文本"""
        if len(data) < 5:
            return f"[数据过短: {len(data)} 字节]"
        slave = data[0]
        func = data[1]
        if func >= 0x80:
            exc = data[2]
            return f"[异常] 从站{slave:02X} 错误码: {exc}"
        byte_count = data[2]
        values = []
        for i in range(byte_count // 2):
            hi = data[3 + i * 2]
            lo = data[4 + i * 2]
            values.append(str((hi << 8) | lo))
        return f"从站{slave:02X}: [{', '.join(values)}]"

把这个 Python 文件放到 COMTool 的插件目录,启动后在「Protocol」面板选择这个插件。之后你在发送框里写 读寄存器 地址0 数量4,点发送,实际发出去的是完整的 Modbus RTU 查询帧(含 CRC)。接收到的十六进制字节会自动变成 从站01: [168, 2234, 0, 512]

n

COMTool: An Elegant and Efficient Cross Platform Serial Debugging Assistant插图
n nn

2.3 更复杂的场景:自定义校验、自定义帧格式

Modbus 协议插件只是一个例子。COMTool 的协议插件的真正价值在于处理那些「市面上没有任何工具支持的私有协议」:

  • 某国产温控器返回 AA BB CC DD EE FF GG HH——前四字节是温度(BCD 码),后四字节是湿度。写个 decode() 解析成 温度: 23.5°C, 湿度: 67.2%
  • 自定义校验:不是标准 CRC16 而是 CRC8/XOR/某厂商自己的魔改校验,写个 Python 函数搞定。

encode()decode() 可以调任何 Python 库——你可以 parse JSON、查字典翻译错误码、甚至调 numpy 做数据滤波。这是 C# 或 C++ 写的串口工具做不到的灵活性。


三、波形/图表 —— 把 Modbus 寄存器值变成实时曲线

3.1 支持两种数据格式

COMTool 内置的 Graph 插件可以从串口数据中提取坐标并绘制实时曲线。支持两种格式:

ASCII 格式(推荐,人可读):

$Curve name,XCoordinate,YCoordinate,checksumn

例子:你的传感器单片机每隔 200ms 发 $temp,1.0,25.3n,COMTool 就会在「temp」曲线上画点 (1.0, 25.3)。带校验和版:$temp,1.0,25.3,179n——校验和是所有字段的 ASCII 码累加取低 8 位。

二进制格式(高效,适合高速采集):协议长度更短,每秒可传上千个点。具体格式见 COMTool 官方文档。

n

COMTool: An Elegant and Efficient Cross Platform Serial Debugging Assistant插图1
n nn

3.2 Modbus 传感器数据可视化的实际做法

假设你有一个 Modbus 温湿度传感器(从站地址 01),返回寄存器 40001(温度,单位 0.1°C)和 40002(湿度,单位 0.1%)。你想在 COMTool 里看到温度和湿度的实时曲线。

用一个中间脚本做桥接:Python 脚本通过 pyserial 读 Modbus 响应 → 解析出温度/湿度 → 按 COMTool 的 ASCII 波形格式输出到虚拟串口 → COMTool 的 Graph 插件直接显示曲线。

或者更直接的方案:用 COMTool 的协议插件做解析,decode() 函数的输出直接格式化为 $temp,{timestamp},{value}n + $humi,{timestamp},{value}n,在 Graph 插件里就能看到两条实时曲线。

多图表支持:可以同时添加温度、湿度、露点温度三条曲线,各自不同颜色。

3.3 C 语言端代码

如果传感器是 STM32/ESP32 自己写的固件,在单片机侧输出 COMTool 兼容的波形数据:

// 发送 ASCII 格式波形数据(含校验和)
int plot_pack_ascii(char *buff, int buff_size,
    const char *curve_name, float x, float y)
{
    int sum = 0;
    int len = snprintf(buff, buff_size, "$%s,%.1f,%.1f",
                       curve_name, x, y);
    for (int i = 1; i < len; i++) sum += buff[i];
    len += snprintf(buff + len, buff_size - len, ",%dn", sum & 0xFF);
    return len;
}

// 在传感器读取循环中调用
char buf[128];
int len = plot_pack_ascii(buf, sizeof(buf), "temp",
                          time_ms / 1000.0, temperature / 10.0);
uart_send_bytes(buf, len);

这样固件端不用做任何 GUI 开发,直接串口输出,COMTool 就能画图。


四、ATK-XCOM / LLCOM / COMTool —— 三者的定位差在哪

对比维度ATK-XCOM V3.0LLCOMCOMTool
开发方正点原子(商用)chenxuuu(个人开源)Neutree(个人开源)
许可证免费闭源Apache 2.0LGPL-3.0
平台WindowsWindowsWin + Mac + Linux + 树莓派
技术栈C# / .NETC# / .NET + xluaPython 3 / PyQt5
脚本/插件✅ Lua 5.3✅ Python 插件
内置 Modbus CRC✅ 协议传输模式❌(需 Lua 手写)❌(需 Python 插件)
实时波形/图表✅ Graph 插件
TCP/UDP
SSH 客户端
多条发送管理✅ 4页×10条✅ 10页不限条数✅ 自定义按钮
安装难度解压即用解压即用pip install 或解压

选型路线图:

  • 你在 Windows 上调 Modbus RTU,需要日常收发+校验 → ATK-XCOM。协议传输模式内置 CRC16,多条发送管理成熟,零学习成本。
  • 你在 Windows 上需要写脚本做自动化测试、多协议联调 → LLCOM。Lua 脚本引擎可以处理任何自动化逻辑,xlua 能调 C# 原生接口。
  • 你用 Mac 或 Linux 做开发,或需要传感器数据可视化 → COMTool。唯一的全平台方案,协议插件在 Modbus 自定义解析上无替代品,波形图表对物理量调试是刚需。
  • 同一个项目中多用 → 三个配合。ATK-XCOM 做日常 Modbus 收发和校验,LLCOM 做批量自动化轮询,COMTool 做传感器波形监控。

五、COMTool 的其他 Modbus 相关用途

5.1 TCP/UDP 调试 Modbus TCP

COMTool 的网络调试模式支持 TCP 客户端/服务端。调 Modbus TCP 设备时,在 TCP 客户端模式下连设备的 IP:502 端口,发送 Modbus TCP 帧(MBAP 头 + PDU),和串口调试一样的操作体验。接收区同样支持协议插件解析。

5.2 SSH 终端 + 串口调试一体

当你的调试对象是一台 Linux 工控机(比如树莓派上跑着 Modbus 主站程序),你可以同时开两个 COMTool 窗口:一个连 SSH 登录工控机看日志和发命令,一个连串口看 Modbus 通信。同一个软件里完成,不用在 Putty 和串口助手之间切来切去。

5.3 配置文件跨机器迁移

COMTool 的串口参数、发送历史、插件配置全部保存在本地配置文件中。你在办公室的 Windows 上配好的所有东西,把配置文件拷到现场的树莓派上——包括你写的协议插件——直接加载,一秒恢复完整的调试环境。


六、安装 COMTool 并开始 Modbus 调试

6.1 Windows(最简单)

从 https://github.com/Neutree/COMTool/releases 下载最新 .zip 文件,解压后双击 comtool.exe。

6.2 macOS

从 Releases 下载 .dmg 安装。或从 PyPI:pip install comtool,然后在终端输入 comtool

6.3 Linux / 树莓派

# Ubuntu/Debian
sudo apt install python3-pyqt5 python3-numpy python3-pip -y
pip install comtool
comtool

# Arch
yay -S python-comtool

# Raspberry Pi - An additional step:Current user joining dialout group
sudo usermod -a -G dialout $USER
sudo reboot

6.4 验证串口通信

插上 USB 转 485 模块,在 COMTool 左侧面板选择串口号:

  • Windows:COM3 等
  • macOS/Linux:/dev/tty.usbserial 或 /dev/ttyUSB0

波特率、数据位、校验位按设备参数设置。点击「打开」。在发送区输入 Modbus 测试帧、切换到十六进制模式、点发送。


COMTool 不是最好的 Modbus 调试工具——ATK-XCOM 的 CRC 内置校验和多条发送更针对 Modbus。COMTool 也不是最灵活的脚本工具——LLCOM 的 Lua 协程和 xlua C# 调用能力更强大。但 COMTool 是唯一一个可以在 Mac、Linux、树莓派上都能丝滑运行,同时允许你用 Python 定制协议解析、还能把传感器数据变成实时曲线的东西。

这就是它的生态位:跨平台 + Python 可定制 + 可视化。三者单独看都有替代品,但三者放一个工具里,目前没有第二个。

本站提供 COMTool 的国内网盘下载和中文使用教程,会员可免费下载全部调试工具合集。一个串口助手解决不了的场景,三个串口助手总能解决。

有问题再聊。

Related Tags
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.