Serielle Geräte

In diesem Dokument wird beschrieben, wie Sie mit der seriellen API von seriellen Geräten lesen und schreiben können. Chrome-Apps können auch mit USB- und Bluetooth-Geräten verbunden werden.

Manifestanforderung

Sie müssen die Berechtigung "serial" zur Manifestdatei hinzufügen:

"permissions": [
  "serial"
]

Verfügbare serielle Ports auflisten

Mit der Methode serial.getDevices können Sie eine Liste der Pfade abrufen, die den verfügbaren seriellen Ports zugeordnet sind. Hinweis:Nicht alle seriellen Ports sind verfügbar. Die API nutzt Heuristiken, um nur serielle Geräte freizugeben, die sicher sein sollten.

var onGetDevices = function(ports) {
  for (var i=0; i<ports.length; i++) {
    console.log(ports[i].path);
  }
}
chrome.serial.getDevices(onGetDevices);

Verbindung zu einem seriellen Gerät herstellen

Wenn Sie den Pfad zum seriellen Port kennen, können Sie mit der Methode serial.connect eine Verbindung dazu herstellen:

chrome.serial.connect(path, options, callback)
ParameterBeschreibung
Pfad (String)Wenn der mit dem Port Ihres Geräts verknüpfte Pfad unbekannt ist, können Sie die Methode serial.getDevices verwenden.
Optionen (Objekt)Parameterobjekt mit mehreren Konfigurationswerten. Weitere Informationen finden Sie unter serial.ConnectionOptions.
callbackWird aufgerufen, wenn der Port erfolgreich geöffnet wurde. Der Callback wird mit dem Parameter connectionInfo aufgerufen, der mehrere wichtige Werte enthält. Weitere Informationen finden Sie unter serial.ConnectionInfo.

Ein einfaches Beispiel:

var onConnect = function(connectionInfo) {
   // The serial port has been opened. Save its id to use later.
  _this.connectionId = connectionInfo.connectionId;
  // Do whatever you need to do with the opened port.
}
// Connect to the serial port /dev/ttyS01
chrome.serial.connect("/dev/ttyS01", {bitrate: 115200}, onConnect);

Verbindung zu einem seriellen Port trennen

Wenn eine Anwendung beendet wird, werden Verbindungen zu seriellen Ports, die nicht persistent sind, automatisch von der Plattform geschlossen. Wenn Sie jedoch die Verbindung trennen möchten, während die Anwendung noch ausgeführt wird, können Sie die Methode serial.disconnect verwenden:

var onDisconnect = function(result) {
  if (result) {
    console.log("Disconnected from the serial port");
  } else {
    console.log("Disconnect failed");
  }
}
chrome.serial.disconnect(connectionId, onDisconnect);

Aus einem seriellen Port lesen

Die serielle API liest aus dem seriellen Port und liefert die gelesenen Byte als ArrayBuffer an Ereignis-Listener. Jeder Port, mit dem Ihre Anwendung verbunden ist, generiert Leseereignisse für alle Listener, die über chrome.serial.onReceive.addListener(onReceiveCallback) hinzugefügt werden. Wenn Sie gleichzeitig mit mehreren Ports verbunden sind, finden Sie den entsprechenden connectionId eines eingehenden Leseereignisses möglicherweise im Callback-Parameter von serial.onReceive.

Im folgenden Beispiel können Lesebyte angesammelt werden, bis eine neue Zeile gelesen wird. Dabei wird der empfangene ArrayBuffer in einen String konvertiert und eine Methode aufgerufen, wenn als letztes empfangenes Zeichen ein Zeilenumbruch gefunden wird:

var stringReceived = '';

var onReceiveCallback = function(info) {
    if (info.connectionId == expectedConnectionId && info.data) {
      var str = convertArrayBufferToString(info.data);
      if (str.charAt(str.length-1) === '\n') {
        stringReceived += str.substring(0, str.length-1);
        onLineReceived(stringReceived);
        stringReceived = '';
      } else {
        stringReceived += str;
      }
    }
  };

chrome.serial.onReceive.addListener(onReceiveCallback);

// [...] not shown here: connect to the serial port

Daten an einen seriellen Port senden

Das Senden von Daten ist einfacher als das Lesen. Der einzige Haken besteht darin, dass Sie bei einem String-basierten Datenprotokoll den Ausgabestring in einen ArrayBuffer umwandeln müssen. Hier ein Codebeispiel:

var writeSerial=function(str) {
  chrome.serial.send(connectionId, convertStringToArrayBuffer(str), onSend);
}
// Convert string to ArrayBuffer
var convertStringToArrayBuffer=function(str) {
  var buf=new ArrayBuffer(str.length);
  var bufView=new Uint8Array(buf);
  for (var i=0; i<str.length; i++) {
    bufView[i]=str.charCodeAt(i);
  }
  return buf;
}

Puffer für serielle Ports leeren

Sie können den Puffer für den seriellen Port leeren, indem Sie den Befehl "flush" ausführen:

  chrome.serial.flush(connectionId, onFlush);

Mehr

Die Serial API verfügt über einige weitere Funktionen. Sie können beispielsweise eine Verbindung als persistent festlegen, damit sie auch dann Daten empfangen kann, wenn die Anwendung nicht ausgeführt wird, oder Sie können Verbindungsparameter wie Bitrate, Zeitüberschreitungen, Steuersignale und viele andere mit der Methode serial.update spontan aktualisieren. Weitere Informationen finden Sie in der vollständigen Referenz zur serial API.