跳转到内容

Web Serial API 浏览器支持

发布于 更新于

Web Serial API — Web Serial API 允许网页应用通过 navigator.serial.requestPort() 请求访问串口, 并使用该端口的 readable 和 writable 流读写数据。

  • 图例
  • 支持
  • 部分支持
  • 需开启标志
  • 不支持
  • 未知
浏览器 / 平台支持版本置信度来源备注
Chrome (Desktop)支持89高来源—
Chrome (Android)支持148高来源—
Edge (Desktop)支持89高来源1
Firefox (Desktop)支持151高来源—
Firefox (Android)不支持—高来源2
Safari (macOS)不支持—高来源3
Safari (iOS)不支持—高来源45
Samsung Internet部分支持30.0高来源67
WebView (Android)不支持—高来源8
  1. 由 browser-compat-data 镜像自 Chrome 的数据推导。
  2. browser-compat-data 未记录 Firefox for Android 的支持。
  3. browser-compat-data 未记录 Safari 的支持。
  4. browser-compat-data 未记录 iOS 版 Safari 的支持。
  5. 由 browser-compat-data 镜像自 Safari 的数据推导。
  6. 仅当串口由蓝牙 RFCOMM 串口仿真提供时才可用。
  7. 由 browser-compat-data 镜像自 Chrome Android 的数据推导。
  8. 实现跟踪:https://crbug.com/40740509。

源数据: /compatibility/web-serial.json · 全球使用占比: 72 % (StatCounter 2026-05)

来源: 规范 · MDN · 最近核验 2026-10-03 · 置信度: 高 (由来源计算)

请求端口必须在用户手势内进行,filters 可将选择器限定为匹配指定 USB vendorId 的端口。 用户选择端口后,需要指定波特率打开端口,然后才能读写数据:

async function connectSerialPort() {
const port = await navigator.serial.requestPort({
filters: [{ usbVendorId: 0x2341 }],
});
await port.open({ baudRate: 9600 });
return port;
}

在提供该功能之前先检测 navigator.serial 是否存在,并为不支持的情况提供回退:

if ('serial' in navigator) {
connectButton.hidden = false;
} else {
connectButton.hidden = true;
fallbackNotice.textContent = '此浏览器无法在页面中访问串口。';
}
  • 需要安全上下文——除了 localhost 这类被视为可信的来源外,普通 HTTP 源不可用。
  • requestPort() 需要短暂的用户激活(点击或 keydown 处理函数);缺少时返回的 Promise 会以 SecurityError DOMException 拒绝。
  • 在调用 port.open({ baudRate }) 之前,port.readable 与 port.writable 均为 null;只有在 open() 完成之后,才能从这两个流上获取 reader/writer。
  • 端口选择器只会列出匹配传入 filters 的端口,如果没有匹配端口,用户将无从选择, 导致返回的 Promise 被拒绝。
  • 各浏览器与平台的支持并不一致:根据 MDN browser-compat-data,Chrome for Android 自 148 版起完整支持;138–146 版仅能访问通过蓝牙 RFCOMM 串口模拟提供的串口,而非 有线连接——依赖该功能前请先查看上方的支持表。

另见 WebUSB API——一种相关但不同的底层设备访问 API, 用于访问未被操作系统驱动占用的 USB 设备。

另见通过 HID 报文实现输入/输出设备访问的 WebHID API。

← 返回兼容性浏览器。