Urządzenia seryjne

W tym dokumencie opisujemy, jak używać serialowego interfejsu API do odczytu i zapisu na urządzeniach szeregowych. Chrome Aplikacje mogą też łączyć się z urządzeniami USB i Bluetooth.

Wymagania dotyczące pliku manifestu

Do pliku manifestu musisz dodać uprawnienie „serial”:

"permissions": [
  "serial"
]

Wyświetlam listę dostępnych portów szeregowych

Aby uzyskać listę ścieżek powiązanych z dostępnymi portami szeregowymi, użyj metody serial.getDevices. Uwaga: nie wszystkie porty szeregowe są dostępne. Interfejs API używa heurystyki do ujawniania tylko tych urządzeń szeregowych, które powinny być bezpieczne.

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

Łączenie z urządzeniem szeregowym

Jeśli znasz ścieżkę powiązaną z portem szeregowym, możesz się z nią połączyć, korzystając z metody serial.connect:

chrome.serial.connect(path, options, callback)
ParametrOpis
ścieżka (ciąg znaków)Jeśli ścieżka powiązana z portem urządzenia jest nieznana, możesz użyć metody serial.getDevices.
opcje (obiekt)Obiekt parametru z kilkoma wartościami konfiguracyjnymi. Szczegółowe informacje znajdziesz na stronie serial.ConnectionOptions.
wywołanie zwrotneWywoływana po pomyślnym otwarciu portu. Wywołanie zwrotne zostanie zrealizowane z jednym parametrem (connectionInfo), który ma kilka ważnych wartości. Szczegółowe informacje znajdziesz na stronie serial.ConnectionInfo.

Prosty przykład:

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

Odłączanie od portu szeregowego

Po zamknięciu aplikacji połączenia z nietrwałymi portami szeregowymi są automatycznie zamykane przez platformę. Jeśli jednak chcesz odłączyć się, gdy aplikacja jest nadal uruchomiona, możesz użyć metody 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);

Odczyt z portu szeregowego

Interfejs szeregowy API odczytuje dane z portu szeregowego i dostarcza bajty odczytu do odbiorników zdarzeń w postaci bufora tablicy. Każdy port, z którym jest połączona aplikacja, będzie generować zdarzenia odczytu dla wszystkich odbiorników dodanych za pomocą chrome.serial.onReceive.addListener(onReceiveCallback). Jeśli masz połączenie z więcej niż 1 portem w tym samym czasie, wartość connectionId dla zdarzenia odczytu przychodzącego możesz znaleźć w parametrze wywołania zwrotnego serial.onReceive.

W tym przykładzie można gromadzić bajty odczytane do momentu odczytania nowego wiersza, konwertować otrzymany obiekt SlateBuffer na String i wywołać metodę, gdy jako ostatni zostanie znaleziony nowy wiersz:

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

Wysyłanie danych do portu szeregowego

Wysyłanie danych jest prostsze niż odczytywanie. Jedynym wyjątkiem jest to, że jeśli protokół danych jest oparty na ciągu znaków, musisz przekonwertować ciąg wyjściowy na ArrayBuffer. Zobacz przykładowy kod poniżej:

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

Opróżnianie bufora portu szeregowego

Możesz wyczyścić bufor portu szeregowego, uruchamiając polecenie flush:

  chrome.serial.flush(connectionId, onFlush);

Więcej

Interfejs Serial API ma kilka innych funkcji. Możesz na przykład ustawić połączenie trwałe, aby otrzymywać dane nawet wtedy, gdy aplikacja nie jest uruchomiona, lub na bieżąco aktualizować parametry połączenia, takie jak szybkość transmisji bitów, limity czasu, sygnały sterujące i wiele innych, za pomocą metody serial.update. Aby dowiedzieć się więcej, zapoznaj się z pełną dokumentacją serial interfejsu API.