我正在使用谷歌Chrome扩展程序,通过串口与Arduino UNO进行通信。我编写了以下函数sendSerialCmd
,它接受一个端口(字符串),一个serial_cmd(ArrayBuffer),以及一个从串行连接读入的readInfo.data(一个ArrayBuffer)传递的回调函数。
var CONNECTION_ID = -1;
var sendSerialCmd = function(port, serial_cmd, callback) {
chrome.serial.open(port, null, function(openInfo){
CONNECTION_ID = openInfo.connectionId;
if (CONNECTION_ID == -1) {
console.log('Could not connect to serial');
return;
}
chrome.serial.write(CONNECTION_ID, serial_cmd, function(writeInfo){
chrome.serial.read(CONNECTION_ID, 8, function(readInfo){
callback(readInfo.data);
});
})
});
chrome.serial.close(CONNECTION_ID, function(result){ console.log(result) });
};
我遇到的一个问题是传递给chrome.serial.read()
函数的第三个参数。在chrome.serial API中,第三个参数是 bytesToRead(整数):要读取的字节数,但是,从我的Arduino进入的字节数可能会发生变化。有时我可能会得到8个字节,有时候会得到更多。获取从Arduino发回的所有字节的最佳方法是什么?
Arduino通过名为Serial.available()的函数提供了一种新颖的解决方案,它返回可读取的字节数。我可以使用Chrome.serial API做类似的事情吗?
答案 0 :(得分:3)
Chrome序列API中没有与Serial.available()
类似的功能,但您应该轮询一些合理的字节数并按照自己的节奏处理数据。
如果要求(例如)1024字节read
并且只有8个字节可用,则read
仍然应该只用8个字节快速成功。如果有一个8字节的消息和一个12字节的消息可用,read
将成功获得20个字节,您可以应用解析结果数据所需的任何逻辑。
仅供参考,Canary中的串行API即将发生变化,您将不再负责使用read
进行手动轮询。相反,Chrome会针对您进行轮询,并在打开的设备上提供数据时发送chrome.serial.onReceive
个事件。