COMTool:优雅高效的跨平台시리얼 포트디버깅 도우미

회원 전용회원 전용

이 콘텐츠는 회원/유료 시스템과 연동되어 있으며, 잠금 해제 후 전체 자료를 보거나 첨부파일을 다운로드할 수 있습니다.

COMTool:优雅高效的跨平台串口调试助手

출처: Modbus 중국 네트워크(modbus.cn) —— 중국 최고의 Modbus 통신 프로토콜 기술 커뮤니티

本文:COMTool:Python 系的跨平台시리얼 통신 디버깅方案 · 作者:modbus기술팀 · 发布于 2026-07-01

요약: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、三菱、欧姆龙的구성(SCADA)软件和编程도구基本只跑 Windows。但有那么几个시나리오,你会突然发现自己需要的시리얼 포트助手在 Windows 上根本没有,或者有了但体验一塌糊涂:

시나리오一:你用的是 MacBook Pro 作为主力개발机,但 USB 转 485 插上去,要调一个 Modbus 센서。열기虚拟机跑 Windows 버전的도구——시리얼 포트透传지연高三倍,偶尔丢帧。

시나리오二:你的게이트웨이跑在 Ubuntu Server 上,现场只有一台树莓派可以插시리얼 포트。你想直接在树莓派桌面환경上开个시리얼 포트助手抓데이터——绝大部分 Windows 도구直接没法用。

시나리오三:你在调一个온습도센서,Modbus 返回的是原始레지스터 값(比如 168 代表 16.8°C),你需要在수신区直接看到온도曲线而非一堆16진수数字。

这三个시나리오,就是 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 即可。注意首次열기时因为未签名,需要在「系统偏好设置→安全性与隐私」中允许运行。如果想多开窗口,终端执行 열기 -n /Application/comtool.app。

Linux:这是 COMTool 的优势场。Ubuntu 系有预编译2진수,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 프로토콜插件解决什么문제

普通的시리얼 포트助手是这样的:你发16진수 010300000001840A,设备回 01030201988432,你用肉眼在回应的바이트里找「0103」、确认슬레이브 주소是对的、跳过去看데이터바이트在哪、再手算一下 CRC。

COMTool 的프로토콜插件(Protocol Plugin)可以让你定义收发两端的데이터处理逻辑:보내기前把「用户友好的입력」(比如「读온도 센서」)自动转成 Modbus RTU 帧;수신后把原始16진수帧自动분석为「센서值: 25.3°C」。全程不需要手看16진수。

원리很简单。每个프로토콜插件是一个 Python 类,必须实现两个核心方法:encode() 和 decode()。

encode() 的作用是把用户입력转成要보내기的原始바이트。decode() 的作用是把수신到的原始바이트转成用户可读的표시 형식。

2.2 一个最简的 Modbus 프로토콜插件예제

以下插件让你在 COMTool 的「Protocol」모드下,发「读레지스터 주소0 数量4」这样的自然언어命令,自动拼成 Modbus RTU 帧보내기。수신到的2진수响应自动분석为「슬레이브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, 데이터: bytes) -> int:
        table = cls._build_crc_table()
        crc = 0xFFFF
        for b in 데이터:
            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, 데이터: bytes) -> str:
        """收到的 Modbus 响应帧 → 분석为人可读的文本"""
        if len(데이터) < 5:
            return f"[데이터过短: {len(데이터)} 바이트]"
        slave = 데이터[0]
        func = 데이터[1]
        if func >= 0x80:
            exc = 데이터[2]
            return f"[异常] 슬레이브{slave:02X} 错误码: {exc}"
        byte_count = 데이터[2]
        values = []
        for i in range(byte_count // 2):
            hi = 데이터[3 + i * 2]
            lo = 데이터[4 + i * 2]
            values.append(str((hi << 8) | lo))
        return f"슬레이브{slave:02X}: [{', '.join(values)}]"

把这个 Python 文件放到 COMTool 的插件目录,启动后在「Protocol」面板选择这个插件。之后你在보내기框里写 读레지스터 주소0 数量4,点보내기,实际发出去的是完整的 Modbus RTU 查询帧(含 CRC)。수신到的16진수바이트会自动变成 슬레이브01: [168, 2234, 0, 512]。

n
COMTool:优雅高效的跨平台串口调试助手插图
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 형식(推荐,人可读):

$曲线名称,X坐标,Y坐标,체크섬n

例子:你的센서单片机每隔 200ms 发 $temp,1.0,25.3n,COMTool 就会在「temp」曲线上画点 (1.0, 25.3)。带체크섬版:$temp,1.0,25.3,179n——체크섬是所有필드的 ASCII 码累加取低 8 位。

2진수형식(高效,适合高速采集):프로토콜길이更短,每秒可传上千个点。具体형식见 COMTool 官方문서。

n
COMTool:优雅高效的跨平台串口调试助手插图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

# 树莓派 - 额外一步:当前用户加入 dialout 组
sudo usermod -a -G dialout $USER
sudo reboot

6.4 验证시리얼 포트통신

插上 USB 转 485 模块,在 COMTool 左侧面板시리얼 포트 선택号:

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

통신 속도、데이터 비트、패리티按设备매개변수设置。클릭「열기」。在보내기区입력 Modbus 测试帧、전환到16진수모드、点보내기。


COMTool 不是最好的 Modbus 디버깅 도구——ATK-XCOM 的 CRC 内置체크섬多条보내기更针对 Modbus。COMTool 也不是最灵活的스크립트도구——LLCOM 的 Lua 协程和 xlua C# 调用能力更强大。但 COMTool 是唯一一个可以在 Mac、Linux、树莓派上都能丝滑运行,同时允许你用 Python 定制프로토콜분석、还能把센서데이터变成实时曲线的东西。

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

本站提供 COMTool 的国内网盘下载和중국어使用튜토리얼,会员可무료下载전체디버깅 도구合集。一个시리얼 포트助手解决不了的시나리오,三个시리얼 포트助手总能解决。

有문제再聊。

相关标签
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注