Dispositivos en serie

En este documento, se describe cómo usar la API en serie para leer y escribir desde dispositivos en serie. Las apps de Chrome también pueden conectarse a dispositivos USB y Bluetooth.

Requisito del manifiesto

Debes agregar el permiso "serie" al archivo de manifiesto:

"permissions": [
  "serial"
]

Enumera los puertos en serie disponibles

Para obtener una lista de las rutas de acceso asociadas con los puertos en serie disponibles, usa el método serial.getDevices. Nota: No todos los puertos en serie están disponibles. La API usa heurísticas para exponer solo los dispositivos en serie que se espera que sean seguros.

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

Conexión a un dispositivo en serie

Si conoces la ruta de acceso asociada con el puerto en serie, puedes conectarte a ella mediante el método serial.connect:

chrome.serial.connect(path, options, callback)
ParámetroDescripción
ruta (cadena)Si se desconoce la ruta asociada con el puerto de tu dispositivo, puedes usar el método serial.getDevices.
opciones (objeto)Objeto de parámetro con varios valores de configuración. Consulta los detalles en serial.ConnectionOptions.
callbackSe invoca cuando el puerto se abre correctamente. Se llamará a la devolución de llamada con un parámetro, connectionInfo, que tiene varios valores importantes. Consulta los detalles en serial.ConnectionInfo.

Un ejemplo sencillo:

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

Desconéctate de un puerto en serie

Cuando una app finaliza, la plataforma cierra automáticamente las conexiones a los puertos en serie que no son persistentes. Sin embargo, si quieres desconectarte mientras la app aún se está ejecutando, puedes usar el 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);

Lee desde un puerto en serie

La API en serie lee del puerto en serie y entrega los bytes de lectura como un ArrayBuffer a los objetos de escucha de eventos. Cada puerto al que esté conectada tu aplicación generará eventos de lectura para todos los objetos de escucha que se agreguen a través de chrome.serial.onReceive.addListener(onReceiveCallback). Si estás conectado a más de un puerto al mismo tiempo, es posible que encuentres el connectionId correspondiente de un evento de lectura entrante en el parámetro de devolución de llamada de serial.onReceive.

En el siguiente ejemplo, se pueden acumular bytes de lectura hasta que se lea una nueva línea, lo que convierte el ArrayBuffer recibido en una String y llama a un método cuando se encuentra un salto de línea como el último carácter recibido:

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

Envía datos a un puerto en serie

Enviar datos es más sencillo que leerlos. La única dificultad es que si tu protocolo de datos se basa en strings, debes convertir la string de salida en una ArrayBuffer. Consulta el siguiente ejemplo de código:

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

Limpia el búfer de un puerto en serie

Para vaciar el búfer del puerto en serie, ejecuta el comando vaci:

  chrome.serial.flush(connectionId, onFlush);

Más

La API de Serial tiene muchas otras funciones. Por ejemplo, puedes configurar una conexión como persistente para que pueda recibir datos incluso cuando tu app no esté en ejecución, o puedes actualizar los parámetros de conexión sobre la marcha, como la tasa de bits, los tiempos de espera, las señales de control y muchos más con el método serial.update. Consulta la referencia completa de la API de serial para obtener más información.