串行设备

本文档介绍了如何使用 serial API 对串行设备执行读写操作。Chrome 应用还可以连接到 USB蓝牙设备。

清单要求

您必须向清单文件添加“serial”权限:

"permissions": [
  "serial"
]

列出可用的串行端口

如需获取与可用串行端口关联的路径列表,请使用 serial.getDevices 方法。注意:并非所有串行端口都可用。该 API 使用启发法仅公开预计是安全的串行设备。

var onGetDevices = function(ports) {
  for (var i=0; i<ports.length; i++) {
    console.log(ports[i].path);
  }
}
chrome.serial.getDevices(onGetDevices);

连接到串行设备

如果您知道与串行端口关联的路径,可以使用 serial.connect 方法连接到该端口:

chrome.serial.connect(path, options, callback)
参数说明
path(字符串)如果与设备端口关联的路径未知,您可以使用 serial.getDevices 方法。
options(对象)具有多个配置值的参数对象。如需了解详情,请参阅 serial.ConnectionOptions
callback在端口成功打开时调用。回调将通过一个参数 connectionInfo 调用,该参数具有多个重要的值。如需了解详情,请参阅 serial.ConnectionInfo

举一个简单的例子:

var onConnect = function(connectionInfo) {
   // The serial port has been opened. Save its id to use later.
  _this.connectionId = connectionInfo.connectionId;
  // Do whatever you need to do with the opened port.
}
// Connect to the serial port /dev/ttyS01
chrome.serial.connect("/dev/ttyS01", {bitrate: 115200}, onConnect);

断开与串行端口的连接

应用终止时,与非持久性串行端口的连接会被平台自动关闭。不过,如果要在应用仍在运行时断开连接,可以使用 serial.disconnect 方法:

var onDisconnect = function(result) {
  if (result) {
    console.log("Disconnected from the serial port");
  } else {
    console.log("Disconnect failed");
  }
}
chrome.serial.disconnect(connectionId, onDisconnect);

从串行端口读取数据

串行 API 从串行端口读取数据,并将读取的字节作为 ArrayBuffer 传送到事件监听器。应用连接到的每个端口都会针对通过 chrome.serial.onReceive.addListener(onReceiveCallback) 添加的所有监听器生成读取事件。如果您同时连接到多个端口,则可能会在 serial.onReceive 的回调参数中找到传入读取事件的相应 connectionId

以下示例会累积读取字节,直至读取一个新行,将收到的 ArrayBuffer 转换为字符串,并在发现新行是接收的最后一个字符时调用一个方法:

var stringReceived = '';

var onReceiveCallback = function(info) {
    if (info.connectionId == expectedConnectionId && info.data) {
      var str = convertArrayBufferToString(info.data);
      if (str.charAt(str.length-1) === '\n') {
        stringReceived += str.substring(0, str.length-1);
        onLineReceived(stringReceived);
        stringReceived = '';
      } else {
        stringReceived += str;
      }
    }
  };

chrome.serial.onReceive.addListener(onReceiveCallback);

// [...] not shown here: connect to the serial port

将数据发送到串行端口

发送数据比读取更简单。唯一的限制是,如果您的数据协议基于字符串,则必须将输出字符串转换为 ArrayBuffer。请参阅以下代码示例:

var writeSerial=function(str) {
  chrome.serial.send(connectionId, convertStringToArrayBuffer(str), onSend);
}
// Convert string to ArrayBuffer
var convertStringToArrayBuffer=function(str) {
  var buf=new ArrayBuffer(str.length);
  var bufView=new Uint8Array(buf);
  for (var i=0; i<str.length; i++) {
    bufView[i]=str.charCodeAt(i);
  }
  return buf;
}

刷新串行端口缓冲区

您可以通过发出 flush 命令来刷新串行端口缓冲区:

  chrome.serial.flush(connectionId, onFlush);

了解详情

Serial API 还有几项其他功能。例如,您可以将连接设置为持久连接,这样即使应用未运行,它也可以接收数据,或者您可以使用 serial.update 方法实时更新连接参数,例如比特率、超时、控制信号等。如需了解详情,请参阅 serial API 的完整参考。