该页面翻译自 Google Chrome Extensions 与 Google Chrome Apps。除非特别说明,该页面的内容遵循 Creative Commons Attribution 3.0 License,代码示例遵循 BSD License。
该文档描述如何使用串行端口 API读取和写入串行端口设备,Chrome 应用还可以连接到 USB 与蓝牙设备。
示例:有关演示如何在 Chrome 应用中连接到硬件设备的例子,请参见 serial、 servo、 usb 和 zephyr_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);