Dispositivos seriais

Este documento descreve como usar a API serial para ler e gravar em dispositivos seriais. Google Chrome Os apps também podem se conectar a dispositivos USB e Bluetooth.

Requisito do manifesto

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

"permissions": [
  "serial"
]

Como listar as portas seriais disponíveis

Para consultar uma lista dos caminhos associados às portas seriais disponíveis, use o serial.getDevices. . Observação:nem todas as portas seriais estão disponíveis. A API usa heurística para expor apenas números que devem 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, conecte-se a ela usando a Método serial.connect:

chrome.serial.connect(path, options, callback)
ParâmetroDescrição
caminho (string)Se o caminho associado à porta do seu 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. O callback será chamado com um parâmetro, connectionInfo, que tem vários valores importantes. Confira 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 aplicativo é encerrado, as conexões com portas seriais não persistentes são fechadas automaticamente pela plataforma. No entanto, se você quiser se desconectar enquanto o app ainda estiver em execução, use o 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 de uma porta serial

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

O exemplo a seguir pode acumular bytes de leitura até que uma nova linha seja lida, convertendo os bytes recebidos ArrayBuffer como String e chamar 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. O único problema é que, se o protocolo de dados for baseado em strings, é 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

Para limpar o buffer da porta serial, emita o comando de limpeza:

  chrome.serial.flush(connectionId, onFlush);

Mais

A API Serial tem vários outros recursos. Você pode, por exemplo, definir uma conexão como persistente, assim ele pode receber dados mesmo quando seu aplicativo não está em execução, ou você pode atualizar os parâmetros de conexão imediatamente, como taxa de bits, tempos limite, sinais de controle e muitos outros com a API serial.update . Consulte a referência completa da API serial para mais informações.