多会话浏览器串口调试助手

1. 背景与目标

本项目基于 Web Serial API 的纯前端串口调试工具,聚焦"多会话"、"增强发送"、"模板拼包"和"轻量易用"的使用体验。核心诉求是:无需安装、直接在支持浏览器里完成设备串口的连接、收发、校验、模板化造帧及会话管理。index.html 的页头显式提示仅支持支持 Web Serial 的 Chrome/Edge,且需 HTTPS 或 localhost 环境访问,保证浏览器权限模型与安全要求满足运行约束。

2. 系统总体设计

2.1 运行环境与约束

  • 运行环境:桌面端 Chrome/Edge 89+;必须在 HTTPS 或 localhost 打开。该约束在 UI 警示条中已提示。
  • 依赖:仅依赖浏览器自带的 Web Serial 与 Web 平台能力,无第三方库。主脚本 app.js 使用原生 ES 语法与模块化风格(IIFE 封装)。
  • 许可:页脚标注 MIT 许可,作者为 Mark。

2.2 文件结构

  • index.html:页面结构与模板、上下文菜单(右键)定义。
  • app.js:业务逻辑与状态管理(Session 类、多会话、串口读写、模板系统、校验算法、右键/拖拽、统计)。
  • styles.css:暗色风格 UI、栅格布局、分栏、拖拽态、响应式样式。

3. 架构设计

整体采用"三层划分 ":UI 结构(HTML) + 表现(CSS) + 逻辑(JS) 。JS 以 Session 为核心对象,负责单会话的串口生命周期、收发与 UI 绑定;外部有会话列表与标签栏(Tabs)管理,实现多会话激活、复制、关闭与拖拽重排。

3.1 模块划分

  1. 串口会话(Session):封装连接、断开、读取循环、发送(文本/HEX/文件/定时)、信号线(DTR/RTS/CTS/DSR)、统计定时器与 UI 同步。
  2. 校验与编码库:SUM8/16、CRC16(XMODEM/IBM/MODBUS)、CRC32(IEEE)与大小端组帧;HEX 文本互转与空格格式化。
  3. 模板系统:默认模板 + 用户模板(localStorage 持久化),支持字段类型 const/var/payload/len/crc,len 支持 of=payload/sofar 与 add 偏置,crc 支持指定端序与参与范围。
  4. 多会话/标签栏管理:创建、激活、复制、关闭、重命名(F2/右键)、拖拽排序,支持"并列显示 + 列数控制"。
  5. UI/交互:Toolbar 控件、终端视图、滚动与时间戳、本地回显、日志导出、ARIA 标签等。

4. 关键流程设计

4.1 串口连接生命周期

  • 连接:navigator.serial.requestPort() → port.open(options) → 获取 writer、初始化统计、启动 readLoop()。UI 上禁用波特率等参数并显示"已连接"。
  • 读取循环:在 readLoop() 中持续 reader.read(),将 value 累加到 RX 计数与速率窗口,并调用 appendRx() 写入终端视图。
  • 断开/清理:cleanupPort() 负责 reader.cancel()/releaseLock()、writer.releaseLock()、port.close(),并停掉统计/自动发送等定时器。
  • 设备物理断开:监听 navigator.serial.disconnect,若当前会话占用该端口则 UI 提示并按需"自动重连"。

4.2 数据接收与呈现

  • 视图支持 HEX/文本 两种显示;可选 时间戳自动滚动。appendRx() 负责格式化与滚动控制。

4.3 数据发送路径

  • 即时发送:回车或按钮触发 sendFromInput(),先通过 buildPayloadFromInput() 构造最终字节流:文本/HEX →(可选)EOL →(可选)校验尾(SUM/CRC,端序可选)→(可选)EOL;同时支持"本地回显"。
  • 自动发送:勾选后以 setInterval() 周期从输入框构帧并写串口。间隔可配置(ms)。
  • 文件发送:选择文件后按 4096B 分片写入串口,防止一次性写入过大阻塞 UI。

4.4 模板拼包(结构化造帧)

  • 默认模板(示例):例如 AA55 + LEN(payload,2,BE) + CMD + PAYLOAD + CRC16/MODBUS(LE, sofar);55AA + CMD + PAYLOAD + SUM8(payload);7E + LEN(sofar,2,LE,add=4) + PAYLOAD + CRC32(sofar)。
  • 字段类型
    • const 固定字节(HEX);
    • var(如 cmd)来自 UI 的十六进制输入;
    • payload 来自发送输入框(文本或 HEX);
    • len 对 payload 或 sofar 长度取值,支持 1/2/4 字节与端序、偏置;
    • crc 对 payload 或 sofar 计算校验并按端序写尾。
  • 使用方式
    • "应用模板发送"直接构帧并写串口;
    • "仅构建→输入框(HEX)"把结果放入发送输入框便于二次编辑或留存。
  • 持久化:用户模板存放于 localStorage 键 ws_serial_templates_v1,支持新增/删除,默认模板不可删除。

4.5 多会话与布局

  • 多会话:支持创建命名页、复制会话(继承串口参数)、关闭前确认(如已连接)。激活会话后,单页模式仅显示该会话面板。
  • 并列显示:勾选"并列显示"后,sessions 容器切换为 grid,列数可选 1/2/3,适配宽屏多串口并行观测。
  • 拖拽排序:可对标签与会话面板进行拖拽,按落点重新排序并重渲染,支持开启/关闭拖拽模式。

4.6 右键菜单与重命名

  • 标签右键可"重命名/关闭/复制",也支持 F2 内联重命名输入,失焦或回车提交,Esc 取消。

4.7 统计与日志

  • 每秒刷新 RX/TX 字节计数、即时速率与连接时长;接收窗口可一键清空与导出 .txt。

5. 数据结构与接口

5.1 Session.state

复制代码
{
  port, reader, writer, connectedAt,
  rxBytes, txBytes, rxBytesWindow,
  rxRateTimer, autoSendTimer, readLoopRunning
}

上述字段驱动会话内部的 I/O、统计与定时器控制。

5.2 模板 JSON Schema(轻量)

  • name: string
  • fields: Array<Field>
  • Field.type ∈ {const|var|payload|len|crc}
  • len: { of: 'payload'|'sofar', size:1|2|4, endian:'be'|'le', add?:number }
  • crc: { algo:'sum8'|'sum16'|'crc16_xmodem'|'crc16_ibm'|'crc16_modbus'|'crc32', endian:'be'|'le', of:'payload'|'sofar' }
  • var: 示例 { name:'cmd' },来源于 UI 的 HEX 输入。

以上定义由 buildByTemplate() 解释执行。

5.3 本地存储

  • 键名:ws_serial_templates_v1;值为用户模板数组 JSON。

6. UI/UX 设计

  • 终端视图:等宽字体、深色主题、滚动承载大量文本与 HEX;按钮分组、表单禁用态与状态文本明确。
  • 辅助能力
    • 接收:时间戳、自动滚动、清空、保存;
    • 发送:本地回显、EOL(none/\n/\r\n)、HEX 自动插空、校验预览(随输入即时更新)。
  • 可及性:部分控件附带 aria-label 与语义化标签结构。
  • 响应式:宽屏两栏栅格;窄屏下改为单列,以媒体查询控制。

7. 可靠性与错误处理

  • 连接异常:connect() 捕获异常并更新状态栏;tryReconnect() 失败亦提示。
  • 读取异常:readLoop() 捕获 read 错误并安全释放 reader 锁。
  • HEX 校验:奇数长度立即报错或不计算预览;模板保存 JSON 解析失败以 alert 反馈。
  • 关闭确认:若会话已连接,关闭前弹窗确认断开。

8. 性能与安全

性能

  • 读循环保守解码,避免 UI 阻塞;
  • 文件发送按 4096B 分片写,兼顾吞吐与流畅度;
  • 统计定时器 1s 刷新,减少频繁 DOM 更新。

安全

  • 仅在 HTTPS/localhost 运行;
  • 使用浏览器的端口权限选择器与信号 API,不越权访问;
  • 无后端与第三方依赖,避免数据泄漏。

9. 测试建议

  1. 连接稳定性:插拔设备、串口占用冲突、参数变更后重连。
  2. 接收渲染:大数据流(如 921600bps)下的滚动与速率统计、不丢字符与时戳正确。
  3. 发送正确性:文本/HEX、EOL 组合、大小端 CRC/SUM 尾部值与预览一致;自动发送间隔边界(1ms/大于 1s)。
  4. 模板造帧:三套默认模板与用户模板(含 len(of=sofar/payload, add)、crc(of=payload/sofar))覆盖多路径。
  5. 会话管理:复制继承参数、重命名/F2、关闭确认、拖拽排序后会话/标签同步。
  6. 持久化:刷新页面后用户模板仍可见、默认模板不可删除。
  7. 兼容性:在未支持浏览器中显示"功能不可用"提示。

10. 扩展规划

  • 协议解码插件:为常见自定义协议提供解析器(基于模板 + 解码回调),在接收端分层显示字段。可在 Session 内部新增"解析管线"接口。
  • 更灵活的端口发现/自动重连:记录最近端口与过滤 VID/PID,结合 getPorts() 多端口策略。
  • 历史命令与脚本:发送历史记忆、脚本宏(循环、延时、条件)。
  • 更丰富的波特率与参数预设:扩展速率下拉或支持自定义输入。
  • 多格式导出:接收日志导出 CSV/PCAP(自定义链路层)或二进制 Raw。
  • UI 细节:会话搜索、颜色主题切换、快捷键地图与国际化。

11. 约束与兼容性

  • 浏览器限制:仅桌面端 Chromium 系;Safari/Firefox 目前不适配 Web Serial。工具在不兼容环境下会给出显式提醒。
  • 串口权限:依赖浏览器原生弹窗授权;无法在后台静默获取。

12. 部署与版本

  • 部署:静态站点即可(HTTPS),将三文件放置服务器;index.html 直接引用 app.js 与 styles.css。
  • 版本识别:建议在页脚或状态处追加 version 字样,并对默认模板变更维护 JSON 版本号。

13. 结论

该工具以 Session 面向对象 的轻量架构,覆盖了嵌入式日常调试 90% 以上的高频场景:多会话并行、灵活的发送造帧与校验、便捷的右键与拖拽操作,并在纯前端形态下实现了良好的可移植性与运维成本极简化。后续如叠加"协议解码插件化"与"脚本化自动化",可进一步提升到车规/量产测试的半自动或自动化能力。

附:代码亮点清单

  • CRC/SUM 算法全自给,端序可选,预览与尾部写入一致,降低"造帧-验证"心智负担。
  • 模板系统语义清晰(const/var/payload/len/crc),len(of=payload/sofar, add) 很贴合实际协议。
  • 文件分片发送(4096B)+ 自动发送(ms 级)+ 本地回显,覆盖工程常见场景。
  • 多会话复制与拖拽排序,结合并列显示(1/2/3 列),更像"调试工作台"。
  • 无第三方依赖,静态托管即可部署;MIT 许可。

相关推荐
小凯123452 小时前
pytest框架-详解(学习pytest框架这一篇就够了)
python·学习·pytest
桂花很香,旭很美3 小时前
Anthropic Agent 工程实战笔记 · 延伸阅读
笔记·架构·agent
今儿敲了吗3 小时前
29| 高考志愿
c++·笔记·学习·算法
山岚的运维笔记3 小时前
SQL Server笔记 -- 第85章:查询提示
数据库·笔记·sql·microsoft·sqlserver
浅念-4 小时前
C++ 模板进阶
开发语言·数据结构·c++·经验分享·笔记·学习·模版
mightbxg5 小时前
【学习一下】深入理解交叉熵
人工智能·学习·机器学习
weixin_458872615 小时前
东华复试OJ每日3题打卡·复盘100~102
学习
2501_926978336 小时前
概率分形理论--从离散到连续--从向量到模型
人工智能·经验分享·agi
桂花很香,旭很美6 小时前
Anthropic Agent 工程实战笔记(二)工具设计
笔记·架构·language model