シリアル デバイス

このドキュメントでは、シリアル 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) を通じて追加されたリスナー。もし 同時に複数のポートに接続した場合、対応する 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

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

データの送信は読み取りよりもシンプルです。唯一の注意点は、データ プロトコルが文字列ベースであれば、 出力文字列を 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 には他にもいくつかの機能があります。たとえば、接続を [Persistent] に設定すると、 アプリが実行されていない場合でもデータを受信できます。また、接続パラメータを serial.update を使用すると、ビットレート、タイムアウト、制御信号など、さまざまな操作を簡単に行えるようになります。 メソッドを呼び出します。詳細については、serial API の完全なリファレンスをご覧ください。