串行端口设备

该文档描述如何使用串行端口 API读取和写入串行端口设备,Chrome 应用还可以连接到 USB蓝牙设备。

示例:有关演示如何在 Chrome 应用中连接到硬件设备的例子,请参见 adkjsledtoggle 以及 servo 示例。

清单文件的要求

您必须在清单文件中加入 "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 (string) 如果与您的设备端口相关联的路径名未知,您可以使用 serial.getDevices 方法。
options (object) 包含多个配置值的参数对象,有关详情请参见 serial.ConnectionOptions
callback 端口成功打开后调用。调用回调函数时将传递一个参数 connectionInfo,包含几个重要的值,有关详情请参见 serial.ConnectionInfo

一个简单的例子:

var onConnect = function(connectionInfo) {
   // 串行端口已打开,保存其标识符以便以后使用。
  _this.connectionId = connectionInfo.connectionId;
  // 对已打开的端口做任何您需要做的事情。
}
// 连接到串行端口 /dev/ttyS01
chrome.serial.connect("/dev/ttyS01", {bitrate: 115200}, onConnect);

断开串行端口连接

您的应用终止时,平台会自动关闭非持久的串行端口连接。然而如果您希望在应用运行时就断开连接,您可以使用 serial.disconnect 方法。

var onDisconnect = function(result) {
  if (result) {
    console.log("已经断开串行端口连接");
  } else {
    console.log("断开连接失败");
  }
}
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);

// [...] 没有包含在这里:连接到串行端口

向串行端口发送数据

发送数据要比读取简单得多,唯一一个需要注意的问题是,如果您的数据协议基于字符串,您必须将您的输出字符串转换为 ArrayBuffer。请参考下列代码:

var writeSerial=function(str) {
  chrome.serial.send(connectionId, convertStringToArrayBuffer(str), onSend);
}
// 将字符串转换为 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;
}

清洗串行端口缓存

您可以通过发出清洗命令清除串行端口缓存:

  chrome.serial.flush(connectionId, onFlush);

更多功能

串行端口 API 还有一些其他功能。例如,您可以将连接设置为持久存在,这样即使您的应用不在运行,它仍然可以接收数据。使用 serial.update 方法,您还可以随时更新连接参数,例如比特率、超时、控制信号等等。有关更多信息请参见 serial API 的完整参考。