Последовательные устройства

В этом документе описывается, как использовать последовательный API для чтения и записи с последовательных устройств. Приложения Chrome также можно подключать к устройствам USB и Bluetooth .

Требование манифеста

Вы должны добавить «последовательное» разрешение в файл манифеста:

"permissions": [
  "serial"
]

Список доступных последовательных портов

Чтобы получить список путей, связанных с доступными последовательными портами, используйте метод serial.getDevices . Примечание. Не все последовательные порты доступны. API использует эвристику, чтобы предоставлять доступ только к последовательным устройствам, которые, как ожидается, будут безопасными.

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

Подключение к последовательному устройству

Если вы знаете путь, связанный с последовательным портом, вы можете подключиться к нему с помощью метода serial.connect :

chrome.serial.connect(path, options, callback)
Параметр Описание
путь (строка) Если путь, связанный с портом вашего устройства, неизвестен, вы можете использовать метод serial.getDevices .
варианты (объект) Объект параметра с несколькими значениями конфигурации. Подробности см. в сериале.ConnectionOptions.
перезвонить Вызывается, когда порт успешно открыт. Обратный вызов будет вызван с одним параметром connectionInfo , который имеет несколько важных значений. Подробности см. в сериале.ConnectionInfo .

Простой пример:

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

Отключиться от последовательного порта

Когда приложение завершает работу, соединения с непостоянными последовательными портами автоматически закрываются платформой. Однако, если вы хотите отключиться, пока ваше приложение все еще работает, вы можете использовать метод 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);

Чтение из последовательного порта

Последовательный API считывает данные из последовательного порта и доставляет прочитанные байты в виде ArrayBuffer прослушивателям событий. Каждый порт, к которому подключено ваше приложение, будет генерировать события чтения для всех прослушивателей, добавленных через chrome.serial.onReceive.addListener(onReceiveCallback) . Если вы подключены к нескольким портам одновременно, вы можете найти соответствующий connectionId входящего события чтения в параметре обратного вызова Serial.onReceive .

В следующем примере можно накапливать прочитанные байты до тех пор, пока не будет прочитана новая строка, преобразуя полученный ArrayBuffer в String и вызывая метод, когда в качестве последнего полученного символа обнаружена новая строка:

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

Отправка данных в последовательный порт

Отправка данных проще, чем чтение. Единственная загвоздка в том, что если ваш протокол данных основан на String, вам необходимо преобразовать выходную строку в ArrayBuffer . См. пример кода ниже:

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

Очистка буфера последовательного порта

Вы можете очистить буфер последовательного порта, введя команду сброса:

  chrome.serial.flush(connectionId, onFlush);

Более

Serial API имеет несколько других функций. Например, вы можете установить постоянное соединение, чтобы оно могло получать данные, даже если ваше приложение не запущено, или вы можете на лету обновлять параметры соединения, такие как битрейт, тайм-ауты, управляющие сигналы и многие другие, с помощью последовательного порта. метод обновления . Дополнительную информацию см. в полной ссылке на последовательный API.