This page was saved using WebZIP 7.0.3.1030 offline browser on 12/24/13 11:31:37.
Address: https://crxdoc-zh.appspot.com/apps/app_serial.html
Title: 串行端口设备 - Google Chrome 应用开发文档(非官方中文版)  •  Size: 25448

串行端口设备

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

示例:有关演示如何在 Chrome 应用中连接到硬件设备的例子,请参见 serialservousbzephyr_hxm 蓝牙示例。

清单文件的要求

您必须在清单文件中加入 "serial" 权限:

"permissions": [
  "serial"
]

列举可用的串行端口

要获取可用串行端口的列表,请使用 getPorts() 方法。注意:并不是所有的串行端口都可用。该 API 采用启发式的方式,基于端口名称,只暴露被视为安全的串行端口设备。

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

打开串行端口设备

如果您知道串行端口的名称,您可以使用 open 方法打开它用于读写:

chrome.serial.open(portName, options, openCallback)
参数 描述
portName (string) 如果您的设备的端口名未知,您可以使用 getPorts 方法。
options (object) 包含单个值的参数对象:bitrate,为一个整数,指定用于与串行端口通信时希望使用的比特率。
openCallback 端口成功打开后调用。该回调函数调用时将传递一个参数 openInfo,包含一个属性 connectionId,请保存该标识符,因为您需要它才能与端口进行实际的通信。

一个简单的例子:

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

关闭串行端口

关闭串行端口很简单但是很重要,请参见下面的例子:

var onClose = function(result) {
 console.log("串行端口已关闭");
}
chrome.serial.close(connectionId, onClose);

读取串行端口

串行端口 API 从串行端口读取数据并以 ArrayBuffer 的方式传递已读取的字节。不能保证所有请求的字节(即使在端口中可用)都能在一个片段中读取。如下过程可以积累读取的字节,一次最多 128 字节,直到读到了换行符,然后调用监听器,传递转换为字符串的 ArrayBuffer

var dataRead='';

var onCharRead=function(readInfo) {
    if (!connectionInfo) {
      return;
    }
    if (readInfo && readInfo.bytesRead>0 && readInfo.data) {
      var str=ab2str(readInfo.data);
      if (str[readInfo.bytesRead-1]==='\n') {
        dataRead+=str.substring(0, readInfo.bytesRead-1);
        onLineRead(dataRead);
        dataRead="";
      } else {
        dataRead+=str;
      }
    }
    chrome.serial.read(connectionId, 128, onCharRead);
  }

/* 将 ArrayBuffer 转换为字符串,使用 UTF-8 编码方案,
   这和 Arduino 默认情况下发送字符串的方式一致 */
  var ab2str=function(buf) {
    return String.fromCharCode.apply(null, new Uint8Array(buf));
  };

写入串行端口

写入例程比读取简单,因为写入操作可以一次完成。唯一的问题是,如果您的数据协议基于字符串,您必须将您的输出字符串转换为 ArrayBuffer。请参考下列代码:

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