2013-07-05 2 views
0

부스트 라이브러리를 사용하여 C++에서 신호와 슬롯을 연결하려고합니다. 내 코드는 현재 파일을 열고 파일에서 데이터를 읽습니다. 그러나 직렬 포트를 사용하여 실시간으로 데이터를 읽고 분석 할 수 있도록 코드를 개선하려고합니다. 직렬 포트에서 데이터를 사용할 수있게되면 분석 기능을 호출해야합니다.직렬 포트에서 바이트를 수신 할 때 신호가 출력됩니다.

어떻게해야합니까? 전에 Qt에서했는데,이 코드는 moc 도구를 사용하지 않기 때문에 Qt에서 신호와 슬롯을 사용할 수 없습니다.

+0

사용중인 OS는 무엇입니까? –

+0

우분투를 사용하고 있습니다. – user2554193

+0

실제로 고민하고있는 것에 대해 더 자세히 설명해 주실 수 있습니까? 시리얼 포트에서 무엇인가를 받았는지, 또는'boost :: signal'이나 다른 것을 사용하는 것을 감지 했습니까? –

답변

0

OS (Linux)는 직렬 포트를 다룰 때 다음과 같은 메커니즘을 제공합니다.

termios 구조에 ICANON 플래그를 설정 해제하여 직렬 포트를 비 표준 모드로 설정할 수 있습니다. 그런 다음 의 MINTIME 매개 변수가 0이면 직렬 포트 입력 버퍼에 새로운 데이터가있는 경우에만 read() 함수가 반환됩니다 (자세한 내용은 termios 매뉴얼 페이지 참조). 그래서, 당신은 들어오는 직렬 데이터를 취득하는 별도의 스레드 실행할 수 있습니다 :

ssize_t count, bytesReceived = 0; 
char myBuffer[1024]; 
while(1) 
{ 
    if (count = read(portFD, 
     myBuffer + bytesReceived, 
     sizeof(myBuffer)-bytesReceived) > 0) 
    { 
    /* 
     Here we check the arrived bytes. If they can be processed as a complete message, 
     you can alert other thread in a way you choose, put them to some kind of 
     queue etc. The details depend greatly on communication protocol being used. 
     If there is not enough bytes to process, you just store them in buffer 
     */ 
     bytesReceived += count; 
     if (MyProtocolMessageComplete(myBuffer, bytesReceived)) 
     { 
       ProcessMyData(myBuffer, bytesReceived); 
       AlertOtherThread(); //emit your 'signal' here 
       bytesReceived = 0; //going to wait for next message 
     } 
    } 
    else 
    { 
    //process read() error 
    } 
} 

를 주요 여기에 생각이 스레드가 read() 새로운 데이터가 도착하는 경우에만 활성화 될 것입니다 호출하는 것입니다. OS는이 스레드를 대기 상태로 유지합니다. 따라서 CPU 시간을 소비하지 않습니다. 실제 signal 부분을 구현하는 방법은 귀하에게 달려 있습니다.

위의 예에서는 포트에서 데이터를 가져 오기 위해 보통 read 시스템 호출을 사용하지만 동일한 방법으로 boost 클래스를 사용할 수 있습니다. 동기 읽기 기능을 사용하면 결과가 동일합니다.

+0

대단히 감사합니다. ICANON 플래그를 해제하고 c_cc []에서 MIN 및 TIME 매개 변수를 설정하는 방법은 무엇입니까? – user2554193

+0

신경 쓰지 마세요. 알아 냈습니다. 그래서 현재 귀하의 코드를 실행하고 있지만 실제로 인쇄되는 바이트는 없습니다. 나는 제대로 작동하는 포트를 열었고 지시대로 모든 설정을 지정했습니다. 그러나 데이터를 읽지는 않습니다. – user2554193

+0

직렬 포트를 다룰 때 고려해야 할 사항이 많이 있습니다. 두 포트에서 동일한 전송 속도, 데이터 비트 및 패리티를 설정해야합니다. 적어도 초기 테스트에서는 흐름 제어를 사용하지 않는 것이 좋습니다. 이 모든 설정은 termios 구조로 이루어집니다. 임베디드 시스템의 경우 직렬 포트 모드 (RS232, RS485, RS422)를 설정할 필요가있을 수 있습니다. 이러한 포트는 또한 비표준 핀 레이아웃을 갖습니다. 사용중인 두 포트 모두에서 모든 것이 올바르게 설정되어 있고 데이터가 아직없는 경우 보내는 응용 프로그램이 실제로 데이터를 보내고 케이블이 올바른지 확인하십시오 –