Web Serial API

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,且支持此功能的浏览器数量有限。

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

注意:此功能在 专用 Web Workers 中可用。

Web Serial API 提供了一种允许网站读取和写入串行设备的方式。这些设备可能通过串行端口连接,也可能是模拟串行端口的 USB 或蓝牙设备。

概念与用法

Web Serial API 是一组允许网站与连接到用户计算机的外围设备通信的 API 之一。它提供了连接到操作系统要求通过串行 API 进行通信的设备的能力,而不是通过 WebUSB API 访问的 USB,或者通过 WebHID API 访问的输入设备。

串行设备的例子包括 3D 打印机和微控制器,例如 BBC micro:bit 板

接口

Serial Experimental

提供用于从网页查找和连接串行端口的属性和方法。

SerialPort Experimental

提供对主机设备上的串行端口的访问。

其他接口的扩展

返回一个 Serial 对象,该对象代表 Web Serial API 的入口点,用于启用串行端口的控制。

WorkerNavigator.serial Read only Experimental

返回一个 Serial 对象,该对象代表 Web Serial API 的入口点,用于启用串行端口的控制。

HTTP 标头

Permissions-Policy serial 指令

控制当前文档是否允许使用 Web Serial API 与串行设备通信,这些设备可以直接通过串行端口连接,或者通过模拟串行端口的 USB 或蓝牙设备。

示例

以下示例演示了 Web Serial API 提供的一些功能。

检查可用端口

以下示例显示了如何检查可用端口,并允许用户授予其访问其他端口的权限。

connectdisconnect 事件允许网站在设备连接或断开系统时做出响应。然后调用 getPorts() 方法来查看网站已获得访问权限的已连接端口。

如果网站没有访问任何已连接端口的权限,它必须等到用户激活才能继续。在本示例中,我们使用按钮上的 click 事件处理程序来完成此任务。将过滤器传递给 requestPort(),其中包含 USB 供应商 ID,以将显示给用户的设备集限制为仅由特定制造商制造的 USB 设备。

js
navigator.serial.addEventListener("connect", (e) => {
  // Connect to `e.target` or add it to a list of available ports.
});

navigator.serial.addEventListener("disconnect", (e) => {
  // Remove `e.target` from the list of available ports.
});

navigator.serial.getPorts().then((ports) => {
  // Initialize the list of available ports with `ports` on page load.
});

button.addEventListener("click", () => {
  const usbVendorId = 0xabcd;
  navigator.serial
    .requestPort({ filters: [{ usbVendorId }] })
    .then((port) => {
      // Connect to `port` or add it to the list of available ports.
    })
    .catch((e) => {
      // The user didn't select a port.
    });
});

从端口读取数据

以下示例显示了如何从端口读取数据。外部循环处理非致命错误,创建一个新的读取器,直到遇到致命错误并且 SerialPort.readable 变为 null

js
while (port.readable) {
  const reader = port.readable.getReader();
  try {
    while (true) {
      const { value, done } = await reader.read();
      if (done) {
        // |reader| has been canceled.
        break;
      }
      // Do something with |value|...
    }
  } catch (error) {
    // Handle |error|...
  } finally {
    reader.releaseLock();
  }
}

规范

规范
Web Serial API
# serial-interface

浏览器兼容性

另见