อุปกรณ์ซีเรียล

เอกสารนี้จะอธิบายวิธีใช้ Serial API เพื่ออ่านและเขียนจากอุปกรณ์ซีเรียล Chrome แอปยังเชื่อมต่อกับอุปกรณ์ USB และบลูทูธได้ด้วย

ข้อกำหนดเกี่ยวกับไฟล์ Manifest

คุณต้องเพิ่มสิทธิ์ "serial" ไปยังไฟล์ Manifest ดังนี้

"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
ตัวเลือก (วัตถุ)ออบเจ็กต์พารามิเตอร์ที่มีการกําหนดค่าหลายค่า โปรดดูรายละเอียดที่ serial.ConnectionOptions
โค้ดเรียกกลับเรียกใช้เมื่อเปิดพอร์ตสำเร็จ ระบบจะเรียกใช้โค้ดเรียกกลับด้วยพารามิเตอร์ 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);

การอ่านจากพอร์ตอนุกรม

Serial API จะอ่านจากพอร์ตอนุกรมและส่งไบต์การอ่านเป็น ArrayBuffer ไปยังตัวฟังเหตุการณ์ ทุกพอร์ตที่แอปพลิเคชันเชื่อมต่ออยู่จะสร้างเหตุการณ์การอ่านสำหรับผู้ฟังทั้งหมดที่เพิ่มผ่าน chrome.serial.onReceive.addListener(onReceiveCallback) หากเชื่อมต่อกับพอร์ตมากกว่า 1 พอร์ตพร้อมกัน คุณอาจเห็น connectionId ที่เกี่ยวข้องของเหตุการณ์การอ่านที่เข้ามาใหม่ในพารามิเตอร์ callback ของ 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 ยังมีฟีเจอร์อื่นๆ อีกมากมาย เช่น คุณตั้งค่าการเชื่อมต่อเป็นถาวรเพื่อให้รับข้อมูลได้แม้แอปไม่ได้ทำงานอยู่ หรือคุณจะอัปเดตพารามิเตอร์การเชื่อมต่อได้ทันที เช่น อัตราบิต ระยะหมดเวลา สัญญาณควบคุม และอื่นๆ อีกมากมายด้วยการใช้เมธอด serial.update ดูข้อมูลอ้างอิงทั้งหมดของ serial API สำหรับข้อมูลเพิ่มเติม