2012-04-30 5 views
1

프로젝트에서 많은 (8) 개의 시리얼 장치를 읽어야합니다. 그들은 Pantilt, Camera, GPS, Compass 등입니다. 그들은 모두 RS232 장치입니다. 그러나 그들은 다른 명령 구조와 동작을 가지고 있습니다. 예를 들어 GPS가 포트를 열면 곧 데이터가 으로 전송되기 시작합니다. PanTilt와 Camera는 특정 명령을 보낼 때만 응답합니다. 내가시리얼 포트 읽기 차단하기

  • OS 환경에게 다음을 사용

    : 우분투 11.10

  • 언어 : C++
  • 프레임 워크 : 팬 틸트 4.7

Qt를하고 카메라는이 같은 기능을 개발하고자합니다.

int SendCommand(string& command, string& response) 
{ 
    port.write(command, strlen(command)); 
    while(1) 
    { 
     if(response contains '\n') break; 
     port.read(response) // Blocking Read 
    } 
    return num_of_bytes_read; 
} 

나는

SendCoammd("GET PAN ANGLE", &angle); 
    if(angle > 60) 
    SendCommand("STOP PAN", &stopped?); 
    if(stopped? == true) 
     SendCommand("REVERSE PAN DIRECTION", &revesed?); 
     if(reversed? == true) 
      SendCommand("START PAN", &ok); 

내가 엄격한 동기 동작을 필요로 이런 일을하려면 ...이 기능이 같은 더 복잡한 알고리즘 을위한 빌딩 블록으로 사용되므로이 방법을 구현하고자합니다. 아무도 이것에 접근하는 방법을 알고 있습니까?

+0

(관련없는 nitpicker 참고 :'string &'전달은 좋은 생각이 아니므로'const string '또는'string'을 원할 수도 있습니다. 또한'string'에'strlen'을 사용하는 것이 바람직하지 않습니다. 그것의'크기'방법) –

답변

0

표준 파일 API 사용의 문제점은 무엇입니까? Qt는 직렬 포트

fd = open("/dev/ttyX"); 
write(fd, command.cstr(), command.size()); 
vector v(MAX_SIZE); 
read(fd,&v[0], MAX_SIZE); 
+0

그렇습니다, 나는 그것을 할 수있다. Qt에서 QextSerialPort를 이미 시도했지만 SerilalPort in :: EventDriven 모드를 사용했습니다. 그래서 readyRead() 신호를 구현해야합니다. 이것은 비동기 읽기입니다. 하지만 내 응용 프로그램에 대해서는 동기 쓰기/읽기가 유용하다고 생각합니다. 어떻게 든 QextSerialPort는 :: 폴링 모드와 함께 작동하지 않습니다. – newbee

+0

쓰기 및 읽기는 동기화입니다 – Baget

0

저레벨 통신 부분적 QIODevice 인터페이스를 구현 QExtSerialPort 라이브러리를 구축 할 수있다.

직접 구현해야하는 고급 프로토콜입니다.

+1

QextSerialPort는 :: EventDriven 모드에서 작동하지만 시도하지는 않았습니다 :: Polling. 직렬 포트 작성 ::: 동기 쓰기/읽기가 필요하므로 폴링 모드에서 작성해야한다고 생각합니다. 그 맞습니까? 어떻게 든 폴링이 작동하지 않습니다. 나는 곧 코드를 게시 할 것이다. 고맙습니다! – newbee

+0

@ user1366507, 일부 경우 작동하지 않을 수 있습니다 (이 라이브러리는 상대적으로 오래된 버전을 사용하며 이벤트도 지원하지 않습니다). 그러나 이벤트에서 항상 추가 스레드를 사용하여 블로킹 모드로 이동할 수 있습니다. – Lol4t0

1

나는이 튜토리얼을 매우 intresting하고 도움이되었다. http://www.webalice.it/fede.tft/serial_port/serial_port.html

boost :: asio를 사용하여 동기화 및 비동기 읽기/쓰기를 수행하는 방법을 보여줍니다.

도움에 감사드립니다!

+0

이것은 대답이 아닌 질문에 대한 주석이어야합니다 (또는 질문을 편집 할 수 있음). – hlovdal