Chrome.serial API - 직렬을 통해 올바른 바이트 수 읽기
-
20-12-2019 - |
문제
저는 직렬을 통해 Arduino UNO와 통신하는 Google Chrome 확장 프로그램을 개발 중입니다.나는 다음 함수를 썼다. sendSerialCmd
포트(문자열), serial_cmd(ArrayBuffer) 및 직렬 연결에서 읽어온 readInfo.data(ArrayBuffer)를 전달하는 콜백 함수를 사용합니다.
var CONNECTION_ID = -1;
var sendSerialCmd = function(port, serial_cmd, callback) {
chrome.serial.open(port, null, function(openInfo){
CONNECTION_ID = openInfo.connectionId;
if (CONNECTION_ID == -1) {
console.log('Could not connect to serial');
return;
}
chrome.serial.write(CONNECTION_ID, serial_cmd, function(writeInfo){
chrome.serial.read(CONNECTION_ID, 8, function(readInfo){
callback(readInfo.data);
});
})
});
chrome.serial.close(CONNECTION_ID, function(result){ console.log(result) });
};
제가 겪었던 문제 중 하나는 chrome.serial.read()
기능.에서 크롬.직렬 API의 세 번째 매개변수는 bytesToRead(정수):읽을 바이트 수, 그러나 내 Arduino에서 들어오는 바이트 수는 변경될 수 있습니다.어떤 때는 8바이트를 얻을 수도 있고 어떤 때는 그 이상을 얻을 수도 있습니다.내 Arduino에서 다시 전송된 모든 바이트를 가져오는 가장 좋은 방법은 무엇입니까?
Arduino는 다음과 같은 기능을 통해 새로운 솔루션을 제공합니다. Serial.available() 읽을 수 있는 바이트 수를 반환합니다.Chrome.serial API로 비슷한 작업을 수행할 수 있나요?
해결책
비슷한 기능은 없습니다 Serial.available()
Chrome 직렬 API에서 사용할 수 있지만 적절한 수의 바이트를 폴링하고 원하는 속도로 데이터를 처리해야 합니다.
만약 read
1024바이트를 요청했는데 8바이트만 사용할 수 있습니다. read
단 8바이트만으로도 빠르게 성공할 수 있습니다.8바이트 메시지와 12바이트 메시지가 사용 가능한 경우 read
20바이트로 성공하며 결과 데이터를 구문 분석하는 데 필요한 모든 논리를 적용할 수 있습니다.
참고로, 직렬 API는 Canary에서 곧 변경될 예정이며 더 이상 수동으로 폴링할 책임이 없습니다. read
.대신 Chrome이 사용자를 폴링하여 실행합니다. chrome.serial.onReceive
오픈 장치에서 이벤트를 데이터로 사용할 수 있습니다.