2010-08-10 15 views
0

직렬 포트에서 읽고 쓰는 C 프로그램을 작성하고 있습니다. 각 쓰기 다음에는 쓰기를 기반으로하는 데이터가 들어있는 읽기가옵니다. 내가 수행 할 약 16 가지의 글을 쓸 것이고, 각각 읽기가 뒤따라 올 것이다.직렬 포트 읽기 및 쓰기 (C)

나는 아직도 시리얼 프로그래밍에 익숙하지 않으며 이것을 접근하는 방법을 결정하려고 노력 중이다. 프로그램이 각 쓰기/읽기 (기본적으로 큰 (1) 쓰기 및 읽기 루프 동안) 동안 블록해야합니까?

다른 스레드가 읽기를 수행하는 동안 한 스레드가 쓰기를 보낼 수 있습니까? 직렬 포트에서 데이터를 읽을 수있는 시점을 스레드가 알 수 있도록 콜백을 만들 수 있습니까?

도움 주셔서 감사합니다.

편집 :

OS : 리눅스

+1

os? windows/linux? – obelix

+0

직렬 인터페이스가 양면 인쇄입니까? – NickHalden

+1

운영 환경을 지정해야합니다. 직렬 포트는 C에서 표준화되지 않았으며 정답에 영향을주는 기능은 시스템마다 다릅니다. – Darron

답변

1

그것은 읽기와 간단한 루프 같은 소리와 쓰기는 충분합니다. 입력이 없을 때 X 초 후에 연결 유지를 작성하는 등 더 많은 제어를 원한다면 select 또는 poll을 사용하십시오. 그들은 데이터를 사용할 수 있는지 "감지"할 수 있으므로 read은 차단되지 않습니다 (그러나 선택과 읽기 사이에 문제가 생길 경우 비 블로킹을 읽어야합니다). 이 경우 멀티 스레딩은 의미가 없습니다.

selectpoll 또한 쓰기가 차단되는지 테스트 할 수 있습니다. 다시 말하지만, 단지 비 블로킹으로 작성하십시오. 일반적으로 프로세스는 select 또는 poll을 제외하고 일부 차단 시스템 호출에 걸려있는 것을 원하지 않습니다. (최소한, 나는 그렇지 않습니다)

ioctl을 사용하여 직렬 라인의 다양한 매개 변수를 설정하십시오.

$ strace -o /tmp/strace.minicom -f minicom 

을 사용하여 minicom (또는 다른 터미널 프로그램)을 시작하고 문제가 발생하면 어떻게 작동하는지 확인하십시오. 항상 그렇듯이 자세한 내용은 man select/poll/read/ioctl을 참조하십시오.

0

일반적으로이 문제를 해결하는 방법에는 여러 가지가 있습니다. 최상의 선택은 직렬 포트를 읽을 때보고있는 데이터 유형과 해당 데이터의 오류 처리 방법에 따라 달라질 수 있습니다.

주먹의 방법은 차단 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 입력 및 출력 루틴을 사용하려는 경우이 작업이 훨씬 어렵습니다. 얼마나 많은 데이터가 준비되어 있는지 묻지 않고서도 첫 번째 방법과 같은 것을 사용하게 될 것입니다.