シリアル デバイス

このドキュメントでは、Serial API を使用してシリアル デバイスの読み取りと書き込みを行う方法について説明します。Chrome アプリは USB デバイスと Bluetooth デバイスにも接続できます。

マニフェストの要件

マニフェスト ファイルに「serial」権限を追加する必要があります。

"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)
パラメータ説明
path(文字列)デバイスのポートに関連付けられたパスが不明な場合は、serial.getDevices メソッドを使用できます。
options(オブジェクト)複数の構成値を持つパラメータ オブジェクト。詳しくは、serial.ConnectionOptions をご覧ください。
callbackポートが正常に開いたときに呼び出されます。コールバックは、いくつかの重要な値を持つ 1 つのパラメータ connectionInfo で呼び出されます。詳しくは、serial.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) を通じて追加されたすべてのリスナーに対して読み取りイベントが生成されます。同時に複数のポートに接続している場合、受信読み取りイベントに対応する connectionIdserial.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

シリアルポートへのデータの送信

データの送信は読み取りよりも簡単です。唯一の問題点は、データ プロトコルが文字列ベースの場合、出力文字列を 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;
}

シリアルポート バッファのフラッシュ

シリアルポート バッファをフラッシュするには、次の flush コマンドを発行します。

  chrome.serial.flush(connectionId, onFlush);

その他

Serial API には他にもいくつかの機能があります。たとえば、接続を永続に設定して、アプリが実行されていない場合でもデータを受信したり、serial.update メソッドでビットレート、タイムアウト、制御信号、その他多くの接続パラメータをすぐに更新したりできます。詳細については、serial API の完全なリファレンスをご覧ください。