일반적으로이 문제를 해결하는 방법에는 여러 가지가 있습니다. 최상의 선택은 직렬 포트를 읽을 때보고있는 데이터 유형과 해당 데이터의 오류 처리 방법에 따라 달라질 수 있습니다.
주먹의 방법은 차단 IO의 일련 파일을 열 수 있고 할 것 :
while (question) {
write(ser_fd, question.data, question.len);
sleep(1);
ioctl(ser_fd, FIONREAD, &answer.len);
answer.data = realloc(answer.data, answer.len);
read(ser_fd, question.answer, question.answer_len);
question = next(question);
answer = next(answer);
}
나는이에 처리 오류를하지 않았지만.
시리얼 포트에 응답이 도착하기를 기다리는 시간 초과를 원한다면 문제가 많이 발생합니다. select, pselect, poll, ppoll 또는 epoll 계열의 시스템 호출을 조사해야합니다. 이렇게하면 데이터를 읽을 준비가 될 때까지 프로그램을 차단 (잠자기) 할 수 있습니다. 그런 다음 설문을 반복하고 답변을 완료하거나 시간이 끝날 때까지 읽을 수 있습니다.
또 다른 옵션은 SIGIO를 사용하는 것이지만 권장하지 않습니다. 이 권한을 얻고 디버그하기는 쉽지 않습니다.
또한 SIGALRM을 사용하여 읽기 호출에서 벗어나 타임 아웃으로 작동 할 수도 있습니다.
stdio 입력 및 출력 루틴을 사용하려는 경우이 작업이 훨씬 어렵습니다. 얼마나 많은 데이터가 준비되어 있는지 묻지 않고서도 첫 번째 방법과 같은 것을 사용하게 될 것입니다.
os? windows/linux? – obelix
직렬 인터페이스가 양면 인쇄입니까? – NickHalden
운영 환경을 지정해야합니다. 직렬 포트는 C에서 표준화되지 않았으며 정답에 영향을주는 기능은 시스템마다 다릅니다. – Darron