Chrome.serial API – Lesen der richtigen Anzahl von Bytes über die serielle Schnittstelle
-
20-12-2019 - |
Frage
Ich arbeite an einer Google Chrome-Erweiterung, die seriell mit einem Arduino UNO kommuniziert.Ich habe die folgende Funktion geschrieben sendSerialCmd
das einen Port (String), einen serial_cmd (ArrayBuffer) und eine Rückruffunktion benötigt, die readInfo.data (einen ArrayBuffer) übergeben bekommt, der von der seriellen Verbindung eingelesen wird.
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) });
};
Eines der Probleme, auf die ich gestoßen bin, ist der dritte Parameter, der an übergeben wird chrome.serial.read()
Funktion.Im chrome.serial API, der dritte Parameter ist die bytesToRead (Ganzzahl):Die Anzahl der zu lesenden Bytes, Allerdings kann sich die Anzahl der von meinem Arduino eingehenden Bytes ändern.Manchmal erhalte ich 8 Bytes, manchmal mehr.Was ist der beste Weg, alle Bytes von meinem Arduino zurückzusenden?
Arduino hat eine neuartige Lösung durch eine Funktion namens Serial.available() Dies gibt die Anzahl der zum Lesen verfügbaren Bytes zurück.Kann ich etwas Ähnliches mit der Chrome.serial-API tun?
Lösung
Es gibt keine vergleichbare Funktionalität Serial.available()
in der seriellen Chrome-API, aber Sie sollten einfach eine angemessene Anzahl von Bytes abfragen und die Daten in Ihrem eigenen Tempo verarbeiten.
Wenn ein read
wird für (sagen wir) 1024 Bytes angefordert und nur 8 Bytes sind verfügbar, die read
sollte mit nur 8 Bytes trotzdem schnell gelingen.Wenn eine 8-Byte-Nachricht und eine 12-Byte-Nachricht verfügbar sind, wird die read
wird mit 20 Bytes erfolgreich sein und Sie können jede erforderliche Logik anwenden, um die resultierenden Daten zu analysieren.
Zu Ihrer Information: Die serielle API wird sich in Canary bald ändern und Sie sind nicht mehr für die manuelle Abfrage verantwortlich read
.Stattdessen führt Chrome eine Abfrage für Sie durch und löst die Aktion aus chrome.serial.onReceive
Ereignisse, da Daten von einem offenen Gerät verfügbar sind.