Dispositivos seriais

Este documento descreve como usar a API serial para leitura e gravação em dispositivos seriais. Os apps do Chrome também podem se conectar a dispositivos USB e Bluetooth.

Requisito do manifesto

Adicione a permissão "serial" ao arquivo de manifesto:

"permissions": [
  "serial"
]

Como listar portas seriais disponíveis

Para ver uma lista de caminhos associados às portas seriais disponíveis, use o método serial.getDevices. Observação:nem todas as portas seriais estão disponíveis. A API usa heurística para expor apenas dispositivos seriais que podem ser seguros.

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

Como se conectar a um dispositivo serial

Se você souber o caminho associado à porta serial, poderá se conectar a ela usando o método serial.connect:

chrome.serial.connect(path, options, callback)
ParâmetroDescrição
path (string)Se o caminho associado à porta do dispositivo for desconhecido, use o método serial.getDevices.
opções (objeto)Objeto de parâmetro com vários valores de configuração. Veja os detalhes em serial.ConnectionOptions
callbackInvocado quando a porta é aberta com êxito. O callback será chamado com um parâmetro, connectionInfo, que tem diversos valores importantes. Veja os detalhes em serial.ConnectionInfo.

Um exemplo simples:

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

Desconectar-se de uma porta serial

Quando um app é encerrado, as conexões com as portas seriais que não são persistentes são automaticamente fechadas pela plataforma. No entanto, se você quiser se desconectar enquanto o app ainda estiver em execução, use o método 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);

Como ler uma porta serial

A API serial lê a porta serial e entrega os bytes de leitura como um ArrayBuffer para listeners de eventos. Cada porta a que seu aplicativo estiver conectado vai gerar eventos de leitura para todos os listeners adicionados por chrome.serial.onReceive.addListener(onReceiveCallback). Se você estiver conectado a mais de uma porta ao mesmo tempo, poderá encontrar o connectionId correspondente de um evento de leitura de entrada no parâmetro de callback de serial.onReceive.

O exemplo abaixo pode acumular bytes de leitura até que uma nova linha seja lida, convertendo o ArrayBuffer recebido em string e chamando um método quando uma nova linha é encontrada como o último caractere recebido:

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

Como enviar dados para uma porta serial

Enviar dados é mais simples do que ler. A única captura é que, se o protocolo de dados for baseado em string, será necessário converter a string de saída em um ArrayBuffer. Confira o exemplo de código abaixo:

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

Como limpar um buffer de porta serial

Limpe o buffer da porta serial emitindo o comando Limpar:

  chrome.serial.flush(connectionId, onFlush);

Mais

A API Serial tem vários outros recursos. Por exemplo, você pode definir uma conexão como persistente, para que ela possa receber dados mesmo quando o app não estiver em execução, ou atualizar os parâmetros de conexão em tempo real, como taxa de bits, tempos limite, sinais de controle e muitos outros com o método serial.update. Consulte a referência completa da API serial para mais informações.