API Chrome.serial - lendo o número certo de bytes via serial
-
20-12-2019 - |
Pergunta
Estou trabalhando em uma extensão do Google Chrome que se comunica com um Arduino UNO via serial.Eu escrevi a seguinte função sendSerialCmd
que usa uma porta (string), um serial_cmd (ArrayBuffer) e uma função de retorno de chamada que recebe readInfo.data (um ArrayBuffer) que é lido a partir da conexão serial.
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) });
};
Um dos problemas que encontrei é o terceiro parâmetro passado para o chrome.serial.read()
função.No cromo.serial API, o terceiro parâmetro é o bytesToRead (inteiro):O número de bytes a serem lidos, no entanto, o número de bytes provenientes do meu Arduino está sujeito a alterações.Às vezes posso obter 8 bytes, outras vezes mais.Qual é a melhor maneira de receber todos os bytes enviados de volta do meu Arduino?
Arduino tem uma solução inovadora através de uma função chamada Serial.disponível() que retorna o número de bytes disponíveis para leitura.Posso fazer algo semelhante com a API Chrome.serial?
Solução
Não há funcionalidade semelhante a Serial.available()
na API serial do Chrome, mas você deve apenas pesquisar um número razoável de bytes e processar os dados em seu próprio ritmo.
Se um read
for solicitado para (digamos) 1024 bytes e apenas 8 bytes estiverem disponíveis, o read
ainda deve ter sucesso rapidamente com apenas 8 bytes.Se houver uma mensagem de 8 bytes e uma mensagem de 12 bytes disponíveis, o read
terá sucesso com 20 bytes e você poderá aplicar qualquer lógica necessária para analisar os dados resultantes.
Para sua informação, a API serial mudará em breve no Canary e você não será mais responsável pela pesquisa manual com read
.Em vez disso, o Chrome fará uma pesquisa para você e disparará chrome.serial.onReceive
eventos, pois os dados estão disponíveis em um dispositivo aberto.