Codex 也能调串口?我做了一个支持 Agent API 的 AI 通讯调试助手

本文介绍一个面向工业通讯调试场景的小工具:AI通讯调试助手 V1.0.0。它既可以作为普通串口/网口调试助手使用,也提供了本地 Agent API,让 Codex 或其他自动化 Agent 能在后台控制界面完成连接、发送、切换 HEX 显示、追加 CRC 等操作。

在这里插入图片描述

文章摘要

本文介绍一款支持 Agent API 的 AI通讯调试助手。它不仅具备串口、网口、HEX 收发、Modbus RTU CRC 自动追加和日志显示等常规调试功能,还可以被 Codex 等 AI Agent 通过本地 HTTP 接口调用,实现自动连接串口、扫描通讯参数、发送 Modbus 报文、切换 HEX 显示并观察收发日志。文章重点讲解工具的功能定位、使用场景,以及 Agent API 的接口设计和调用示例。

下载与源码

如果目标电脑已经安装 .NET 8 Desktop Runtime,可以下载体积较小的框架依赖版;如果不确定运行环境,建议直接下载自包含版。

在这里插入图片描述

为什么做这个工具

传统串口调试助手通常是“人点按钮、人输入报文、人看日志”。这在普通调试时够用,但当我们希望 AI Agent 参与调试流程时,就会遇到几个问题:

  • AI 不能稳定地直接操作复杂桌面控件;
  • 连接参数、发送内容、日志状态需要结构化读取;
  • Modbus RTU 报文需要自动追加 CRC;
  • 既要让 Agent 后台操作,又要让用户在界面上看到每一步变化;
  • 调试过程需要保留真实 TX/RX 日志,方便人工复核。

所以这个工具的设计目标不是简单地“再做一个串口助手”,而是把桌面调试助手变成一个可以被 AI 调用的本地工具。

工具定位

AI通讯调试助手是一个 Windows WinForms 桌面工具,当前 V1.0.0 主要包含:

  • 串口调试;
  • TCP Client / TCP Server 调试;
  • HEX 和文本发送;
  • HEX 和文本日志显示;
  • 追加 CRLF;
  • 串口 HEX 报文自动追加 Modbus RTU CRC;
  • Modbus RTU CRC 校验摘要;
  • Modbus TCP MBAP 摘要;
  • 定时发送;
  • 日志复制、清空、导出、过滤、搜索;
  • 本地虚拟串口回环;
  • 本地 Agent HTTP API。

界面上仍然保留了普通调试助手的操作方式。也就是说,即使不使用 AI,它也可以作为一个常规通讯调试助手使用。

功能场景

下面以 Codex 通过 Agent API 调用通讯调试助手完成 Modbus RTU 调试为例,说明这个工具可以覆盖的典型流程:

  1. 启动 AI通讯调试助手;
  2. Codex 连接本地 Agent API;
  3. 在不知道通讯参数的情况下,从 9600 波特率开始扫描;
  4. 识别到可用参数:COM5 115200,8,N,1
  5. 切换收发日志为 HEX 显示;
  6. 自动发送 Modbus RTU 读取保持寄存器报文;
  7. 工具自动追加 CRC;
  8. 界面中显示 TX/RX 日志和 CRC 校验结果;
  9. Codex 根据回包解析保持寄存器值。

关键点在于:Agent 的调用不是“后台偷偷发数据”,而是会同步到真实 WinForms 界面。用户能看到发送框内容变化,也能看到收发日志变化。

在这里插入图片描述

Agent API 设计思路

Agent API 默认监听本机:http://127.0.0.1:8765

它只绑定本地回环地址,默认不对局域网开放。设计上优先满足本机 Codex、脚本、自动化程序调用。

如果配置了 Token,请在请求头中携带:X-CommTool-Agent-Token: your-token

通用响应结构如下:

{
  "ok": true,
  "message": "已发送 8 B",
  "txBytes": 8,
  "status": {}
}

其中 statusGET /api/status 返回结构一致,方便调用方每次操作后同步界面状态。

Agent API 总览

方法 路径 作用
GET /api/status 查询当前串口、网口、发送框、复选框和计数状态
POST /api/serial/connect 设置串口参数并打开串口
POST /api/serial/disconnect 关闭串口
POST /api/serial/send 写入串口发送框并按选项发送
POST /api/serial/options 设置串口页复选框
POST /api/network/connect 设置网口参数并连接 TCP Client 或启动 TCP Server
POST /api/network/disconnect 关闭网口连接或监听
POST /api/network/send 写入网口发送框并按选项发送
POST /api/network/options 设置网口页复选框

下面分别展开说明。

1. 查询状态

接口:GET /api/status

PowerShell 示例:

Invoke-RestMethod -Method Get `
  -Uri "http://127.0.0.1:8765/api/status"

典型返回:

{
  "selectedTab": "serial",
  "serialOpen": true,
  "serialEndpoint": "COM5 115200,8,N,1",
  "serialSendText": "01 03 00 01 00 0A",
  "serialTimestamp": true,
  "serialHexLog": true,
  "serialAutoScroll": true,
  "serialHexSend": true,
  "serialAppendCrlf": false,
  "serialAppendRtuCrc": true,
  "serialRepeatSend": false,
  "serialDtrEnable": false,
  "serialRtsEnable": false,
  "serialTxBytes": 8,
  "serialRxBytes": 25,
  "networkOpen": false,
  "networkEndpoint": "TCP 客户端空闲",
  "networkSendText": "",
  "networkTimestamp": true,
  "networkHexLog": false,
  "networkAutoScroll": true,
  "networkHexSend": false,
  "networkAppendCrlf": false,
  "networkRepeatSend": false,
  "networkTxBytes": 0,
  "networkRxBytes": 0
}

这个接口是所有 Agent 自动化流程的入口。比如 Codex 可以先判断工具是否在线、当前是否已经打开串口、HEX 显示是否已勾选、TX/RX 计数是否增长。

2. 串口连接

接口:POST /api/serial/connect

请求体:

{
  "portName": "COM5",
  "baudRate": 115200,
  "dataBits": 8,
  "parity": "None",
  "stopBits": "1",
  "encodingName": "UTF-8",
  "readTimeout": 1000,
  "writeTimeout": 1000,
  "dtrEnable": false,
  "rtsEnable": false,
  "closeExisting": true,
  "open": true
}

字段说明:

字段 类型 说明
portName string 串口名,例如 COM5
baudRate number 波特率,例如 9600115200
dataBits number 数据位,常用 8
parity string 校验位:NoneEvenOddMarkSpace
stopBits string 停止位:11.52,也支持 OneOnePointFiveTwo
encodingName string 文本收发编码,例如 UTF-8ASCIIGBK
readTimeout number 读超时,单位 ms
writeTimeout number 写超时,单位 ms
dtrEnable bool 是否启用 DTR
rtsEnable bool 是否启用 RTS
closeExisting bool 打开前是否先关闭已有串口
open bool 是否立即打开串口

PowerShell 示例:

$body = @{
  portName = "COM5"
  baudRate = 115200
  dataBits = 8
  parity = "None"
  stopBits = "1"
  encodingName = "UTF-8"
  readTimeout = 1000
  writeTimeout = 1000
  closeExisting = $true
  open = $true
} | ConvertTo-Json -Compress

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/serial/connect" `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

调用后,界面左侧串口参数区会同步更新,按钮状态也会变成已连接状态。

3. 串口断开

接口:POST /api/serial/disconnect

示例:

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/serial/disconnect"

这个接口用于关闭当前串口连接。关闭后状态区会显示未连接。

4. 串口发送

接口:POST /api/serial/send

请求体:

{
  "text": "01 03 00 01 00 0A",
  "hexSend": true,
  "appendCrlf": false,
  "appendRtuCrc": true,
  "send": true
}

字段说明:

字段 类型 说明
text string 要写入发送框的内容
hexSend bool 是否按 HEX 发送
appendCrlf bool 是否追加 CRLF
appendRtuCrc bool 是否自动追加 Modbus RTU CRC
send bool true 表示写入发送框后立即发送,false 表示只更新发送框

读取 1 号从站保持寄存器 1-10 示例:

$body = @{
  text = "01 03 00 01 00 0A"
  hexSend = $true
  appendRtuCrc = $true
  send = $true
} | ConvertTo-Json -Compress

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/serial/send" `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

这里的 text 不需要手动写 CRC。工具会根据 appendRtuCrc=true 自动追加 CRC16,界面日志里会显示完整发送帧。

5. 串口复选框选项

接口:POST /api/serial/options

请求体:

{
  "timestamp": true,
  "hexLog": true,
  "autoScroll": true,
  "hexSend": true,
  "appendCrlf": false,
  "appendRtuCrc": true,
  "repeatSend": false,
  "dtrEnable": false,
  "rtsEnable": false
}

字段说明:

字段 对应界面选项
timestamp 时间戳
hexLog HEX 显示
autoScroll 自动滚动
hexSend HEX 发送
appendCrlf 追加 CRLF
appendRtuCrc 追加 CRC
repeatSend 周期发送
dtrEnable DTR 使能
rtsEnable RTS 使能

只想打开 HEX 日志、HEX 发送和追加 CRC,可以这样调用:

$body = @{
  hexLog = $true
  hexSend = $true
  appendRtuCrc = $true
  timestamp = $true
  autoScroll = $true
} | ConvertTo-Json -Compress

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/serial/options" `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

没有传入的字段会保持原状态,这样 Agent 可以只改自己关心的选项。

6. 网口连接

接口:POST /api/network/connect

TCP Client 请求体:

{
  "mode": "TCP Client",
  "remoteHost": "127.0.0.1",
  "remotePort": 502,
  "encodingName": "UTF-8",
  "closeExisting": true,
  "open": true
}

TCP Server 请求体:

{
  "mode": "TCP Server",
  "localPort": 502,
  "encodingName": "UTF-8",
  "closeExisting": true,
  "open": true
}

字段说明:

字段 说明
mode TCP ClientTCP Server
remoteHost TCP Client 远程地址
remotePort TCP Client 远程端口
localPort TCP Server 本地监听端口
encodingName 文本编码
closeExisting 是否先关闭已有连接
open 是否立即连接或监听

7. 网口断开

接口:POST /api/network/disconnect

示例:

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/network/disconnect"

8. 网口发送

接口:POST /api/network/send

请求体:

{
  "text": "00 01 00 00 00 06 01 03 00 01 00 0A",
  "hexSend": true,
  "appendCrlf": false,
  "send": true
}

Modbus TCP 示例:

$body = @{
  text = "00 01 00 00 00 06 01 03 00 01 00 0A"
  hexSend = $true
  send = $true
} | ConvertTo-Json -Compress

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/network/send" `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

9. 网口复选框选项

接口:POST /api/network/options

请求体:

{
  "timestamp": true,
  "hexLog": true,
  "autoScroll": true,
  "hexSend": true,
  "appendCrlf": false,
  "repeatSend": false
}

示例:

$body = @{
  hexLog = $true
  hexSend = $true
  timestamp = $true
  autoScroll = $true
} | ConvertTo-Json -Compress

Invoke-RestMethod -Method Post `
  -Uri "http://127.0.0.1:8765/api/network/options" `
  -ContentType "application/json; charset=utf-8" `
  -Body $body

Codex 调用流程示例:未知 Modbus 参数扫描

如果连接了一个 Modbus RTU 从站,但不知道通讯参数,可以让 Agent 按候选参数逐个尝试。

典型流程:

  1. 调用 GET /api/status 判断工具是否在线;
  2. 枚举系统串口,例如 COM5
  3. 9600 开始尝试常见波特率;
  4. 尝试 8N18E18O18N2
  5. 每组参数调用 /api/serial/connect
  6. 设置 /api/serial/optionshexLog=truehexSend=trueappendRtuCrc=true
  7. 调用 /api/serial/send 发送探测报文;
  8. 再查 /api/status,通过 serialRxBytes 增量判断是否收到响应;
  9. 根据响应长度判断是否符合 Modbus RTU 格式。

建议探测报文:

01 03 00 00 00 01
01 03 00 01 00 05
01 03 00 01 00 0A

典型响应长度:

请求 含义 正常响应长度
01 03 00 00 00 01 读 1 个保持寄存器 7 字节
01 03 00 01 00 05 读 5 个保持寄存器 15 字节
01 03 00 01 00 0A 读 10 个保持寄存器 25 字节

在这个使用示例中,Codex 从 9600 开始扫描,最终识别到:COM5 115200,8,N,1

随后发送读取保持寄存器 10-20 的报文:01 03 00 0A 00 0B

工具自动追加 CRC,界面中显示:

TX 8B 01 03 00 0A 00 0B 24 0F [RTU Unit=1 FC=0x03 CRC OK]
RX 27B 01 03 16 00 00 42 48 00 00 3F 00 00 00 00 03 00 03 00 00 00 00 3F 00 00 01 A7 60 [RTU Unit=1 FC=0x03 CRC OK]

这就形成了一个很清晰的人机协作链路:Agent 负责尝试、发送、判断;工具负责真实通讯和日志呈现;人可以随时看界面复核。

适合哪些场景

这个工具比较适合:

  • 上位机开发过程中的串口调试;
  • Modbus RTU 设备现场参数确认;
  • TCP Client / TCP Server 简单收发测试;
  • 自动化脚本批量发送测试报文;
  • AI Agent 辅助排查通讯参数;
  • 教学或培训场景中讲解“AI 如何调用本地工业软件工具”。

它不适合替代完整 SCADA、PLC 编程软件或复杂协议主站。它更像是一个轻量、开放、可被 Agent 调用的通讯调试工作台。

当前限制

V1.0.0 中 Agent API 主要返回状态、发送字节数和 TX/RX 计数。历史日志文本和最新 RX 原始字节暂时没有通过 API 直接返回。

也就是说,如果 Agent 要自动解析寄存器值,目前可以通过界面日志或后续扩展接口实现。后续计划增加类似接口:GET /api/serial/logsGET /api/serial/last-rx

这样 Agent 就可以直接读取最新回包并完成寄存器解析。

小结

AI通讯调试助手 V1.0.0 的核心价值,不只是“能发串口数据”,而是让桌面通讯调试工具具备了可被 Agent 调用的能力。

普通用户可以继续用按钮和文本框调试串口、网口;Codex 或其他 Agent 可以通过 HTTP API 在后台执行连接、发送、切换选项、扫描参数等动作;所有关键变化又会同步显示到界面上,方便人随时接管和确认。

对工业自动化调试来说,这是一种很实用的组合:AI 负责重复尝试和流程编排,人负责判断目标和确认结果。

项目地址:https://github.com/lidecong133/AICommTool

V1.0.0 下载:https://github.com/lidecong133/AICommTool/releases/tag/v1.0.0

推荐标签

#C# #WinForms #串口调试 #Modbus #工业自动化 #Codex #AI Agent #上位机开发

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐