Ваша ОС (Linux) предоставляет вам следующий механизм при работе с последовательным портом.
Вы можете установить свой последовательный порт в неканонический режим (путем снятия отметки ICANON
с флагом в структуре termios
). Затем, если параметры MIN
и TIME
в c_cc[]
равны нулю, функция 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()
будет активна только при поступлении новых данных. В остальное время ОС сохранит этот поток в состоянии ожидания. Таким образом, он не будет потреблять процессорное время. Это зависит от вас, как реализовать фактическую часть signal
.
В приведенном выше примере используется регулярный read
системный вызов для получения данных из порта, но вы можете использовать класс boost
таким же образом. Просто используйте функцию синхронного чтения, и результат будет таким же.
Какая ОС вы используете? –
Я использую Ubuntu – user2554193
Можете ли вы описать более подробно то, с чем вы на самом деле боретесь? Обнаружив, что вы получили что-то на последовательном порту, или как использовать 'boost :: signal', или что-то еще? –