Serial API

airwalk·2023년 12월 28일

웹에서 serial port 연결해서 LOW, HIGH에 따른 처리를 해야하는 일이 생김.
웹 API 중에 requestPort 사용하기로함.

  • 사파리에서는 지원이 안되고 크롬, 엣지에서 지원됨을 사용자에게 미리 알리고 진행.
const port = await navigator.serial.requestPort(); // 
const info = port.getInfo(); // 연결된 usb 시리얼 정보

// 연결
// 사용하는 시리얼 모듈이 flowControl을 none으로 하라고 함.
await port.open({ baudRate: 9600, flowControl: "none" });

// 읽을 때 사용
const textDecoder = new TextDecoderStream();
const readableStreamClosed = port.readable.pipeTo(textDecoder.writable);
const reader = textDecoder.readable.getReader()

// 명령어 보낼때 사용
const writer = port.writable.getWriter();

while (true) {
	
	try {
		// 5초동안 응답이 오지 않으면 에러 던지는 코드
		const { value, done } = await reader.read();
		
		if (done) {
			break
		}

	} catch (err) {
		// 에러처리
	}
}



// 스트림 종료
if (reader) {
    reader.cancel();
}

await readableStreamClosed.catch(() => {
  /* 에러를 무시한다 */
});

if (writer) {
  writer.releaseLock();
}

await port.close();

링크

0개의 댓글