API Chrome.serial: lectura del número correcto de bytes a través de serie
-
20-12-2019 - |
Pregunta
Estoy trabajando en una extensión de Google Chrome que se comunica con un Arduino UNO a través de serie.Escribí la siguiente función sendSerialCmd
que toma un puerto (cadena), un serial_cmd (ArrayBuffer) y una función de devolución de llamada que pasa readInfo.data (un ArrayBuffer) que se lee desde la conexión serie.
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) });
};
Uno de los problemas con los que me he topado es el tercer parámetro pasado al chrome.serial.read()
función.En el chrome.serial API, el tercer parámetro es el bytesToRead (entero):El número de bytes a leer., sin embargo, la cantidad de bytes que llegan desde mi Arduino está sujeta a cambios.A veces puedo obtener 8 bytes, otras veces más.¿Cuál es la mejor manera de recuperar todos los bytes desde mi Arduino?
Arduino tiene una solución novedosa a través de una función llamada Serie.disponible() que devuelve el número de bytes disponibles para leer.¿Hay algo similar que pueda hacer con la API Chrome.serial?
Solución
No existe una funcionalidad similar a Serial.available()
en la API serial de Chrome, pero solo debe sondear una cantidad razonable de bytes y procesar los datos a su propio ritmo.
si un read
se solicita para (digamos) 1024 bytes y solo hay 8 bytes disponibles, el read
Aún así debería tener éxito rápidamente con solo 8 bytes.Si hay un mensaje de 8 bytes y un mensaje de 12 bytes disponibles, el read
tendrá éxito con 20 bytes y podrá aplicar cualquier lógica que sea necesaria para analizar los datos resultantes.
Para su información, la API en serie cambiará pronto en Canary y ya no será responsable de sondear manualmente con read
.En lugar de eso, Chrome sondeará por ti y despedirá chrome.serial.onReceive
eventos ya que los datos están disponibles desde un dispositivo abierto.