序列裝置

本文說明如何使用 serial API 從序列裝置讀取及寫入。Chrome 應用程式也可以連線至 USB藍牙裝置。

資訊清單規定

您必須在資訊清單檔案中新增「序列」權限:

"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 方法。
選項 (物件)具有多個設定值的參數物件。詳情請參閱 serial.ConnectionOptions
回呼成功開啟通訊埠時叫用。系統會使用 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) 新增的所有事件監聽器產生讀取事件。如果您同時連線至多個通訊埠,可以在 serial.onReceive 的回呼參數中找到傳入的讀取事件對應的 connectionId

以下範例可以累積讀取位元組,直到讀取新行為止,進而將已收到的 ArrayBuffer 轉換為字串,並在系統找到最後一個字元時,呼叫方法:

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 的完整參考資料。