该页面翻译自 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);