Web Serial API: 串行设备数据获取API

3,025 阅读2分钟

串行端口是一种双向通信接口,允许逐字节发送和接收数据。

Web Serial API: 为网站读写串行设备提供了一种方法。这些设备可以通过串口连接,也可以是模拟串口的USB或蓝牙设备。

系统串行端口读写 API 通过全局 navigator.serial 属性公开。

Web Serial API 只能在安全上下文中运行(HTTPS),兼容性

连接串行端口

Web Serial API 提供 requestPort(options) 方法查询可用的串行连接端口。

requestPort 方法返回一个 Promise,该实例解析为 SerialPort 表示用户选择的设备,如果没有选择设备则拒绝。

此方法必须在用户激活时调用, 即需要手动 Click

// 一个对象列表,包含用于搜索附加设备的供应商和产品id
const filters = [
  {
    usbVendorId: 0x00,  // 标识USB设备供应商的无符号短整数。
    usbProductId: 0x00, // 标识USB设备的无符号短整数。
  }
]
const port = await navigator.serial.requestPort({ filters });

filters 中的无符号短整数可在device-log中查询

SerialPort 接口的open()方法返回一个Promise,该Promise在端口打开时解析。缺省情况下,端口为8位数据位、1位停止位且不进行奇偶校验。“波特率”为必填参数。

波特率需要按照串行设备配置统一,否则可能不能接收数据

const options = {
  baudRate: 9600, // 一个正的、非零的值,表示串口通信应该建立的波特率
  dataBits: 8, // 7或8的整数值,表示每帧的数据位数。默认值为8
  stopBits: 1, // 1或2的整数值,表示帧结束时的停止位数。默认值为1。
  parity: 'none', // 奇偶校验模式为“none”、“偶”或“奇”。默认值为none。
  bufferSize: 255, // 一个无符号长整数,指示要建立的读和写缓冲区的大小。如果未通过,默认值为255。
  flowControl: 'none', // 流控制类型,“none”或“hardware”。默认值为none。
}
await port.open(options);
// 连接成功

读取数据

从串口接收数据的应用程序通常会使用这样的嵌套循环方式。

// 因为数据返回的是 Uint8Array, 所以需要解析一次
const textDecoder = new TextDecoderStream();
const readableStreamClosed = port.readable.pipeTo(textDecoder.writable);
const reader = textDecoder.readable.getReader();


while (port.readable) { 
  try { 
    while (true) { 
      const { value, done } = await reader.read(); 
      if (done) { 
        break; 
      } 
      // 处理数据
   } 
  } catch (error) { 
    // 处理报错
  } finally { 
    reader.releaseLock(); 
  }  
}

数据逐字节发送,因此需要拼接一下。最终以'\r\n'结尾,可以通过此条件判断为单次读取数据完成

总结

通过以上内容我们解了了 Web Serial API 读取数据的使用方法,想了解写入(writeable)可参考下面链接。

如有表述不准确的地方,请大家指正。

参考

  1. web-dev-serial
  2. wicg-serial