Web Serial API 实战:浏览器打开即用的串口调试工具详解
做了这么多年嵌入式开发串口调试已经成了每天离不开的操作。Windows 上用各种桌面版串口助手Mac 上敲 screen 命令Linux 下用 minicom换一台电脑就得重新装驱动、配权限、找对应的工具版本这套流程说不上多痛苦但确实反复在消耗时间。后来发现基于 Web Serial API 的开源 Web 串口调试工具越来越多浏览器打开就能连串口不用装客户端也不用考虑操作系统差异实测下来日常调试效率提升非常明显。这篇文章就把我体验过的工具、原理和实际操作过程完整拆一遍适合嵌入式开发者、物联网工程师、硬件爱好者也包括那些需要远程协助现场设备的同学。1. 为什么浏览器能直接读写串口先从 Web Serial 说起1.1 传统串口调试工具的三个痛点桌面串口助手虽然功能成熟但实际使用中总有绕不开的坎。第一个痛点就是安装与驱动。哪怕只是临时看一眼设备日志也得先下载安装包再确认 USB 转串口芯片的驱动是不是正常CH340、CP2102、FTDI 这几类芯片的驱动在不同操作系统上表现还不一样Windows 新版本对未签名驱动的拦截越来越严格我遇到过好几次设备插上后设备管理器里能看到 COM 口但串口助手就是打不开最后排查发现是驱动版本不匹配。第二个痛点是跨平台不一致。同一个项目开发机是 Windows测试机是 Mac现场工控机是 Linux三台机器的串口工具完全不一样操作习惯也要重新适应。第三个痛点是远程支持困难。设备在现场出了问题现场人员往往不懂技术你让他下载串口助手、找到 COM 口、设置波特率、把日志发给你这中间每一步都可能卡住远程排查半小时可能连日志都没拿到。这些痛点不是偶尔出现而是嵌入式开发日常里反复发生的琐碎问题。相比而言Web 串口工具把依赖全部收敛到了浏览器里终端用户只需要打开一个网址剩下的授权、连接、数据收发都发生在网页里体验完全统一。这也是为什么我后来在给团队做技术支持时越来越倾向于直接用 Web 方案而不是要求对方安装特定软件。1.2 Web Serial API 的工作原理浏览器能够读写串口靠的是 Web Serial API这是 W3C 制定的一个浏览器标准接口目前 Chrome、Edge、Opera 等基于 Chromium 内核的浏览器都原生支持。它做的事情可以简单理解为把操作系统层面的串口访问能力封装成了 JavaScript 可以调用的异步接口网页通过几个关键的 API 方法就能完成打开串口、读写数据、关闭串口这一整套操作。整个流程里的核心模型是这样的用户通过浏览器访问网页时网页本身不能直接访问串口设备必须由用户主动触发一个操作比如点击页面上的连接按钮此时浏览器会弹出一个设备选择列表列出当前电脑上可用的串口用户选择某个设备后浏览器会向页面返回一个 port 对象接下来页面用 port.open({ baudRate: 115200 }) 来打开指定波特率的串口连接。打开之后读取数据通过 port.readable 获取一个 reader 对象写入数据则通过 port.writable 获取 writer 对象整个交互和 Node.js 里的流操作类似。举个最简单的例子如果我想在浏览器控制台里手动验证当前网页能否连接串口可以这样写if (serial in navigator) { const port await navigator.serial.requestPort(); await port.open({ baudRate: 115200 }); const reader port.readable.getReader(); const writer port.writable.getWriter(); writer.write(new TextEncoder().encode(AT\r\n)); while (true) { const { value, done } await reader.read(); if (done) break; console.log(new TextDecoder().decode(value)); } }注意 requestPort 必须在用户手势中调用也就是必须由点击等交互触发这是浏览器的安全策略目的是防止网页在后台偷偷扫描和访问你的串口设备。这个设计其实和手机 App 申请摄像头权限是一样的逻辑访问硬件设备必须让用户知情并主动授权。1.3 优势与边界什么时候用它效率最高Web Serial 方案最大的优势是零安装、零驱动配置。只要浏览器版本足够新打开 HTTPS 网页或者 localhost 本地页面就能直接访问串口。这对于只需要查看日志、发送简单指令、烧录固件这类高频操作来说确实让打开即用从口号变成了现实。但也要说清楚它的边界避免大家踩坑。首先是浏览器支持范围Firefox 和 Safari 目前都不支持 Web Serial API如果团队所有人统一用 Chrome 或者 Edge问题不大但如果有人用 Safari这个方案就行不通。其次是功能限制Web Serial 目前不能访问所有类型的串口设备比如部分使用了特殊驱动的虚拟串口设备可能无法识别而且网页应用无法像桌面软件那样随意修改系统级的串口参数。另外串口设备在同一时刻只能被一个进程打开当浏览器持有串口时桌面串口助手就会提示端口被占用反之亦然。从效率角度看最适合用 Web 串口工具的场景包括现场设备调试、给非技术人员远程支持、跨平台开发环境统一以及教育场景里的快速演示。在这些场景里少装一个软件、少配一次驱动省下的时间非常可观。2. 开源项目怎么选三类工具与选型建议2.1 我可以推荐的三类开源 Web 串口工具GitHub 上基于 Web Serial 的开源项目其实已经不少了我根据自己的使用经验把它们分成三类。第一类是轻量级串口终端这类项目通常是一个单网页应用界面模仿经典串口助手有连接管理、波特率设置、发送输入框、日志显示区支持文本和 HEX 收发。代表项目比如 Web Serial Terminal、Serial Terminal 等特点是简单直接适合日常快速调试代码量小也容易二次修改。第二类是设备厂商主导的 Web 烧录工具最典型的是乐鑫官方的 ESP Web Flash 工具。这类工具把固件编译、擦除 Flash、烧录、查看启动日志整合到了一个网页里用户只需要在浏览器里选择固件文件点击烧录剩下的底层操作都由网页自动完成。对于 ESP32 系列的开发者来说这已经成了我烧录固件的主要方式之一效果非常稳定。第三类是功能更完整的开发调试面板这类项目除了串口收发往往还集成了终端模拟、数据可视化、日志导出、脚本自动化等功能。例如一些开源项目在 Web Serial 基础上封装了 xterm.js 终端可以直接在浏览器里操作设备的串口交互式命令行体验接近 SecureCRT 等桌面软件。我的建议是如果你只是想快速解决调试问题选第一类轻量终端就够了如果你主要做 ESP32 开发直接使用官方 Web 烧录工具如果你需要长时间盯着日志、还要做数据统计和分析第三类项目会更合适。2.2 选型要点与部署方式选型时我会重点看四个维度。第一是传输格式是否支持文本和 HEX 两种收发模式因为调试传感器或者 Modbus 设备时HEX 模式是硬需求。第二是日志功能有没有时间戳、日志导出、自动滚动开关这些细节在排查问题时帮助很大。第三是波特率设置范围一般项目都会把常用波特率做成下拉菜单但有些设备需要 921600 甚至更高的速率需要确认项目是否支持自定义输入。第四是 UI 与交互流畅度串口日志刷新频率很高如果页面渲染性能不好日志多的时候会明显卡顿。部署方面绝大多数 Web 串口工具都是纯前端项目构建产物是一堆静态文件所以部署方式极其灵活。最简单的方式是直接用 GitHub Pages把项目 fork 到自己仓库开启 Pages 服务几分钟就能拥有一个公网可访问的串口调试页面。如果要在内网使用用 Nginx 托管静态目录即可一条 server 配置就搞定。对于需要跨设备访问的场景可以考虑部署到自己的服务器上通过 HTTPS 访问因为 Web Serial API 在非安全上下文环境下是无法使用的localhost 虽然可以但局域网 IP 访问一般需要配证书这一点部署时要注意。3. 手把手实操浏览器打开即用的完整流程3.1 连接前的准备与设备确认在用 Web 串口工具之前有几项准备工作不能忽略。首先是检查浏览器版本Chrome 89 及以上版本才能稳定使用 Web Serial API旧版本可能出现 API 不存在的情况。其次是确认设备的 USB 转串口驱动已经安装好了这一步目前还绕不开虽然浏览器不需要单独的串口客户端但操作系统层面的驱动仍然是必须的设备插上后在系统设备列表里能看到一个新的 COM 口或者 /dev/ttyUSB* 节点才算准备就绪。我在实际使用中习惯先用系统自带的方式确认串口工作正常比如在 Windows 设备管理器里看一下 COM 口号在 Linux 下用 ls /dev/ttyUSB* 确认设备节点存在确认之后再去浏览器页面进行连接。这样做的原因是如果浏览器端连接不上可以快速区分问题是出在驱动层还是 Web Serial 层排查效率会高很多。另外还要注意如果当前电脑上的串口已经被其他程序占用浏览器端会连接失败这种问题后面章节会专门讲。3.2 授权连接与基本收发操作打开 Web 串口项目页面后整个操作流程非常直观。以我常用的轻量终端为例页面顶部会有一个连接或者Connect按钮点击之后浏览器会弹出一个设备选择窗口列出当前电脑上所有可用的串口设备。这里有一个实际经验分享如果设备列表是空的大概率是驱动没有正确安装或者设备已经被其他进程占用而不是网页的问题。选择一个串口设备后页面通常会要求设置波特率常见设备默认是 115200部分 GPS 模块默认是 9600根据你的设备手册填写即可。点击打开之后页面下方会出现串口状态提示显示已连接和当前波特率。接下来就可以在发送区输入数据了文本模式下直接输入字符点击发送设备返回的数据会实时显示在日志区。对于需要发送回车换行的场景绝大多数工具都有一个追加回车换行的选项我调试 AT 指令时通常都会勾上否则设备不会识别指令结束符。HEX 收发模式我在这里多说一句。调试 Modbus RTU 或者某些私有协议时数据都是十六进制字节流文本模式下看到的是乱码所以需要切换为 HEX 模式。切到 HEX 后发送区需要输入形如 01 03 00 00 00 0A 这样的十六进制字符串收到的数据也会按字节显示为十六进制用这种模式排查协议字段非常直观。3.3 参数设置的细节波特率、流控与数据格式串口通信参数中波特率是最常见的配置项它决定了数据传输速率理论上波特率越高传输越快但必须与设备端保持一致否则收到的就是乱码。除了波特率很多工具还提供数据位、停止位、校验位的设置大多数场景使用 8N1也就是 8 个数据位、无校验、1 个停止位这也是串口通信最通用的配置。流控设置是容易被忽略的一项。有些设备使用了 RTS/CTS 硬件流控连接时需要打开对应的流控开关否则设备端会不发数据或者不停地发。这个参数如果设置不对表现往往是连接成功但收不到任何数据新手经常在这里卡很久。我在调试一些老式工业设备时遇到过这个问题最后就是勾选流控选项后正常出数据的。另外 DTR 和 RTS 两个信号也不能忽略许多设备靠这两个信号决定是否进入烧录模式或者复位比如部分 ESP32 设备在 DTR 和 RTS 的组合控制下才能自动进入下载模式这些细节在 Web 工具里通常都有对应的开关默认状态不一定适合你的设备需要根据实际情况调整。还有一个实用细节是日志区的自动滚动开关。设备长时间运行输出日志时如果自动滚动开启页面会始终显示最新数据方便实时观察但如果要看某一段历史数据需要先把自动滚动关掉否则内容一直在跳动根本没法定位问题。我调 PID 参数时日志长且密集这个开关来回切换的频率非常高。4. 两个真实场景ESP32 烧录与 STM32 日志调参4.1 用 Web 工具给 ESP32 烧录固件ESP32 系列芯片在物联网开发里用得非常多传统烧录方式需要安装 esptool 命令行工具还要记住各种参数和命令对不熟悉命令行的同学来说并不友好。现在用 Web 烧录工具整个流程简化成了打开网页、选择设备、选择固件、点击烧录四步。我实际操作的一次记录是这样的把 ESP32 开发板通过 USB 线连到电脑确定驱动正常后在浏览器里打开 Web 烧录工具的页面点击连接按钮在设备列表中选择对应的串口此时网页会自动检测芯片型号并提示当前 ESP32 的烧录模式。如果芯片不在烧录模式一般需要按住开发板上的 BOOT 按键再按一下 EN 按键让模块进入下载模式网页上也会给出对应的提示。接下来选择编译好的固件文件一般是从 build 目录里生成的 .bin 文件。对于使用 Arduino 或 ESP-IDF 开发的工程需要根据自己的分区表选择合适的 bin 文件或者直接选择合并后的固件包。选好文件之后点击烧录网页会先擦除 Flash然后把固件写入芯片这个过程底部会显示进度条和写入速度。烧录完成后网页还能继续查看设备的启动日志不需要切换到另一个串口助手这一点在实际开发中非常省事烧录完直接看日志验证效果形成了一条完整的调试链路。这里说一个我踩过的坑烧录失败最常见的原因是串口被占用。有些同学开着桌面串口助手的自动刷新功能再打开 Web 烧录工具就会发现端口无法访问。另外USB 线也必须用数据线而不是纯充电线我曾经在调试时换了一根充电线结果是设备管理器里能看到 USB 设备但就是没有串口排查了半天才发现是线材的问题。4.2 STM32 串口日志与 PID 参数调试跑在 STM32 上的固件调试时最常见的需求就是看串口日志和调整 PID 参数。传统做法是 MCU 通过串口打印格式化日志开发者在电脑上的串口助手窗口观察数据手动修改参数后重新编译下载固件整个迭代周期比较长。用 Web 串口工具之后日志查看变得更轻量因为浏览器本身就是一个现代化的渲染环境可以直接把日志内容进行二次处理。我实际用过的一个方案是这样的STM32 固件里预设了串口命令解析功能能接收并修改 PID 参数参数修改后立即生效并回传当前效果。以前这个交互要用专门的桌面工具配合现在直接在浏览器页面里发送类似 SET_KP 1.25 这样的指令然后在日志区观察对应的响应和系统运行曲线数据。对于持续输出的运行数据如果只靠肉眼盯着滚动的文本很难看出参数变化带来的趋势差异。我的做法是让固件按固定格式输出数值比如用逗号分隔的字段浏览器端再配合简单的脚本把这些数据实时绘制成折线图调整 Kp、Ki、Kd 后曲线变化一目了然。开源 Web 串口项目通常不直接内置可视化图表功能但既然数据已经能被网页读取做可视化就只是写脚本的问题了。Web Serial 在这种场景里的真正价值是让调试反馈链路变短。以前改一次 PID 参数要重新编译、烧录、重启设备整个过程几十秒起步现在一条串口指令发下去设备立刻响应配合浏览器里的日志和曲线几分钟就能完成一组参数对比。效率和体验的差距非常明显。5. 常见问题与避坑实录5.1 高频问题排查速查表用 Web 串口工具时间长了我把遇到的典型问题整理成了一个速查表遇到问题先按表排查能省掉大量摸索时间。问题现象可能原因解决思路点击连接后设备列表为空USB 驱动未装好 / 设备被占用检查设备管理器里的 COM 口关闭其他串口工具打开串口后所有数据都是乱码波特率不匹配 / 数据位停止位设置错误确认设备手册参数重新设置并重新连接连接成功但收不到任何数据流控设置错误 / 设备端没在发送尝试启用 RTS/CTS 流控检查设备端代码网页提示 serial 未定义浏览器不支持 Web Serial API更换 Chrome 或 Edge 新版浏览器并在 HTTPS 环境下访问烧录过程中进度条卡住数据线质量问题 / 芯片未进入烧录模式换数据线按 BOOT 键重新进入下载模式关闭页面后重新打开串口连不上端口未正确释放 / 浏览器还在占用等待几秒或刷新页面确认其他标签页没有占用串口局域网 IP 访问时无法使用串口非安全上下文限制使用 localhost 访问或部署 HTTPS 证书日志量大时页面卡顿渲染性能瓶颈关闭自动滚动或开启日志缓冲区限制功能关于端口占用这个问题我再补充一个细节Web Serial 和桌面程序对串口的占用是互斥的如果你开着两个浏览器标签页同时连接同一个串口后一个页面会连接失败。有些情况下页面关闭了但浏览器进程没有完全释放串口重新连接时需要等几秒。遇到这种情况我一般是彻底关闭浏览器再重新打开基本都能解决。还有一个容易被忽略的细节是设备拔插与页面状态不一致。如果连接串口后直接拔掉 USB 线页面并不会自动感知设备已断开此时界面上仍然显示已连接但实际上已经收不到任何数据了。这时候需要手动断开连接再重新连接我建议养成先断开再拔线的习惯能避免很多状态错乱的问题。5.2 安全与权限使用建议Web Serial 虽然方便但在使用上还是要保持必要的安全意识。浏览器对串口的访问有一套权限制约机制网页必须在用户主动点击后才能弹出设备选择窗口而且每次打开新页面进行连接时都需要再次授权这种做法能有效防止恶意网页在后台偷偷访问设备。从使用者的角度我有几个建议。第一是避免在不可信的网站上使用串口功能尤其是那些你并不了解、突然弹出串口连接请求的页面不要轻易授权因为串口数据往往直接来自真实硬件设备可能包含敏感信息。第二是在公共电脑上使用完串口工具后一定要点击断开连接再关闭页面避免串口被后续使用者误连。第三是在团队协作时如果要分享公网部署的串口工具建议部署时增加简单的访问控制比如内网使用或者加一层身份验证毕竟能操作串口的网页本身就是一种设备控制入口。另外补充一点合规常识在线 Web 串口工具在连接设备时会在浏览器内显示完整授权过程选择设备后可以看到设备名称、厂商等信息这些信息只能表明设备类型不代表网页可以获得超过串口读写之外的权限。串口 API 能做的仅仅是读写串口数据无法访问文件系统、摄像头、麦克风等其他设备能力这一点可以从浏览器设计层面放心。最后分享两个我在实践中觉得很实用的小技巧第一个技巧是完全不需要寻找成型的 Web 串口项目也可以快速体验 Web Serial。直接在 Chrome 中打开任意 HTTPS 页面按 F12 打开开发者工具在 Console 面板里粘贴一段调用 Web Serial API 的脚本就能把浏览器变成一个简易串口终端。这个方法非常适合临时验证串口设备是否正常或者做一些简单的自动化数据抓取不用部署任何项目。第二个技巧是如果你经常需要在多台电脑间切换工作环境可以把常用的 Web 串口页面做成浏览器书签搭配浏览器账号同步功能换电脑后打开书签就能继续调试这比每台电脑重新安装配置串口助手快得多。我个人已经习惯了这样的工作流代码在哪台电脑上写不重要调试串口只需要一个浏览器标签页就够了。Web 串口调试工具不是要取代桌面串口助手而是在特定场景下提供了一种更轻量的选择。远程支持时发一个链接现场人员打开浏览器就能反馈数据跨平台团队协作时不用再纠结驱动和版本快速验证设备时省去安装软件的时间。这些看起来都是小细节但累积起来确实能让嵌入式开发的工作效率翻倍。