직렬 장치

이 문서에서는 직렬 API를 사용하여 직렬 기기에서 읽고 쓰는 방법을 설명합니다. Chrome 앱은 USB블루투스 기기에도 연결할 수 있습니다.

매니페스트 요구사항

매니페스트 파일에 '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 메서드를 사용할 수 있습니다.
옵션 (객체)여러 구성 값이 있는 매개변수 객체입니다. 자세한 내용은 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를 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;
}

직렬 포트 버퍼 플러시

플러시 명령어를 실행하여 직렬 포트 버퍼를 플러시할 수 있습니다.

  chrome.serial.flush(connectionId, onFlush);

더보기

Serial API에는 여러 다른 기능이 있습니다. 예를 들어 연결을 영구로 설정하여 앱이 실행되지 않을 때도 데이터를 수신할 수 있습니다. 또는 serial.update 메서드를 사용하여 비트 전송률, 시간 제한, 제어 신호 등의 연결 매개변수를 즉석에서 업데이트할 수 있습니다. 자세한 내용은 serial API의 전체 참조를 확인하세요.