Dispositivi seriali

Questo documento descrive come utilizzare l'API seriale per leggere e scrivere da dispositivi seriali. Le app di Chrome possono anche connettersi a dispositivi USB e Bluetooth.

Requisito del file manifest

Devi aggiungere l'autorizzazione "serial" al file manifest:

"permissions": [
  "serial"
]

Elenco delle porte seriali disponibili

Per ottenere un elenco dei percorsi associati alle porte seriali disponibili, utilizza il metodo serial.getDevices. Nota:non tutte le porte seriali sono disponibili. L'API utilizza l'euristica per esporre solo i dispositivi seriali che si prevede siano sicuri.

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

Connessione a un dispositivo seriale

Se conosci il percorso associato alla porta seriale, puoi connetterti utilizzando il metodo serial.connect:

chrome.serial.connect(path, options, callback)
ParametroDescrizione
path (stringa)Se il percorso associato alla porta del dispositivo è sconosciuto, puoi utilizzare il metodo serial.getDevices.
opzioni (oggetto)Oggetto parametro con diversi valori di configurazione. Visualizza i dettagli in serial.ConnectionOptions.
callbackRichiamato quando la porta è stata aperta correttamente. Il callback verrà chiamato con un parametro, connectionInfo, che ha diversi valori importanti. Vedi i dettagli in serial.ConnectionInfo.

Un semplice esempio:

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);

Disconnettersi da una porta seriale

Quando un'app viene terminata, le connessioni alle porte seriali non permanenti vengono chiuse automaticamente dalla piattaforma. Tuttavia, se vuoi disconnetterti mentre l'app è ancora in esecuzione, puoi utilizzare il metodo serial.disconnect:

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

Lettura da una porta seriale

L'API seriale legge dalla porta seriale e fornisce i byte letti sotto forma di ArrayBuffer agli ascoltatori di eventi. Ogni porta a cui è connessa la tua applicazione genererà eventi di lettura per tutti gli ascoltatori aggiunti tramite chrome.serial.onReceive.addListener(onReceiveCallback). Se ti connetti a più porte contemporaneamente, potresti trovare il valore connectionId corrispondente a un evento di lettura in entrata nel parametro di callback di serial.onReceive.

L'esempio seguente può accumulare byte letti fino alla lettura di una nuova riga, convertendo l'ArrayBuffer ricevuto in String e chiamando un metodo quando viene trovata una nuova riga come ultimo carattere ricevuto:

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

Invio di dati a una porta seriale

Inviare dati è più semplice che leggere. L'unico problema è che, se il protocollo dati è basato su stringhe, devi convertire la stringa di output in un ArrayBuffer. Vedi l'esempio di codice riportato di seguito:

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;
}

Svuotamento del buffer di una porta seriale

Puoi svuotare il buffer della porta seriale inviando il comando flush:

  chrome.serial.flush(connectionId, onFlush);

Altre

L'API Serial include diverse altre funzionalità. Ad esempio, puoi impostare una connessione come permanente, in modo che possa ricevere dati anche quando l'app non è in esecuzione, oppure aggiornare all'istante i parametri di connessione, come la velocità in bit, i timeout, i segnali di controllo e molti altri con il metodo serial.update. Per ulteriori informazioni, consulta il riferimento completo dell'API serial.