Chrome.serial API – чтение нужного количества байтов через последовательный порт
-
20-12-2019 - |
Вопрос
Я работаю над расширением Google Chrome, которое взаимодействует с Arduino UNO через последовательный порт.Я написал следующую функцию sendSerialCmd
для этого требуется порт (строка), серийный_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 есть новое решение с помощью функции под названием Серийный.доступен() который возвращает количество байтов, доступных для чтения.Могу ли я сделать что-то подобное с API Chrome.serial?
Решение
Аналогичного функционала нет Serial.available()
в последовательном API Chrome, но вам следует просто запросить некоторое разумное количество байтов и обработать данные в своем собственном темпе.
Если read
запрашивается (скажем) 1024 байта, а доступно только 8 байтов, read
все равно должно быстро добиться успеха всего с 8 байтами.Если доступно 8-байтовое сообщение и 12-байтовое сообщение, read
получится с 20 байтами, и вы сможете применить любую логику, необходимую для анализа полученных данных.
К вашему сведению, последовательный API скоро изменится в Canary, и вы больше не будете нести ответственность за ручной опрос с помощью read
.Вместо этого Chrome опрашивает вас и запускает chrome.serial.onReceive
события, поскольку данные доступны с открытого устройства.