串行端口设备
该文档描述如何使用串行端口 API读取和写入串行端口设备,Chrome 应用还可以连接到 USB 与蓝牙设备。
示例:有关演示如何在 Chrome 应用中连接到硬件设备的例子,请参见 adkjs、ledtoggle 以及 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 的完整参考。