本文档介绍了如何使用 serial API 对串行设备执行读写操作。Chrome 应用还可以连接到 USB 和蓝牙设备。
清单要求
您必须向清单文件添加“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(字符串) | 如果与设备端口关联的路径未知,您可以使用 serial.getDevices 方法。 |
options(对象) | 具有多个配置值的参数对象。如需了解详情,请参阅 serial.ConnectionOptions |
callback | 在端口成功打开时调用。回调将通过一个参数 connectionInfo 调用,该参数具有多个重要的值。如需了解详情,请参阅 serial.ConnectionInfo。 |
举一个简单的例子:
var onConnect = function(connectionInfo) {
// The serial port has been opened. Save its id to use later.
_this.connectionId = connectionInfo.connectionId;
// Do whatever you need to do with the opened port.
}
// Connect to the serial port /dev/ttyS01
chrome.serial.connect("/dev/ttyS01", {bitrate: 115200}, onConnect);
断开与串行端口的连接
应用终止时,与非持久性串行端口的连接会被平台自动关闭。不过,如果要在应用仍在运行时断开连接,可以使用 serial.disconnect 方法:
var onDisconnect = function(result) {
if (result) {
console.log("Disconnected from the serial port");
} else {
console.log("Disconnect failed");
}
}
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);
// [...] not shown here: connect to the serial port
将数据发送到串行端口
发送数据比读取更简单。唯一的限制是,如果您的数据协议基于字符串,则必须将输出字符串转换为 ArrayBuffer
。请参阅以下代码示例:
var writeSerial=function(str) {
chrome.serial.send(connectionId, convertStringToArrayBuffer(str), onSend);
}
// Convert string to 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;
}
刷新串行端口缓冲区
您可以通过发出 flush 命令来刷新串行端口缓冲区:
chrome.serial.flush(connectionId, onFlush);
了解详情
Serial API 还有几项其他功能。例如,您可以将连接设置为持久连接,这样即使应用未运行,它也可以接收数据,或者您可以使用 serial.update 方法实时更新连接参数,例如比特率、超时、控制信号等。如需了解详情,请参阅 serial API 的完整参考。