串行设备

本文档介绍了如何使用串行 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) 添加的监听器。如果您 在同时连接到多个端口时,您可能会发现connectionId serial.onReceive 的回调参数中的传入读取事件。

以下示例可以累积读取字节,直到有新行被读取,从而将收到的 将 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 的完整参考。