OS (Linux)는 직렬 포트를 다룰 때 다음과 같은 메커니즘을 제공합니다.
termios
구조에 ICANON
플래그를 설정 해제하여 직렬 포트를 비 표준 모드로 설정할 수 있습니다. 그런 다음 의 MIN
및 TIME
매개 변수가 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
클래스를 사용할 수 있습니다. 동기 읽기 기능을 사용하면 결과가 동일합니다.
사용중인 OS는 무엇입니까? –
우분투를 사용하고 있습니다. – user2554193
실제로 고민하고있는 것에 대해 더 자세히 설명해 주실 수 있습니까? 시리얼 포트에서 무엇인가를 받았는지, 또는'boost :: signal'이나 다른 것을 사용하는 것을 감지 했습니까? –