Издающий сигнал при получении байтов в последовательный порт

Я пытаюсь соединить сигнал и слот в C ++, используя библиотеки повышения. Мой код в настоящее время открывает файл и читает данные из него. Тем не менее, я пытаюсь улучшить код, чтобы он мог читать и анализировать данные в режиме реального времени, используя последовательный порт. Я хотел бы, чтобы функции анализа вызывались только при наличии данных в последовательном порту.

Как бы я поступил так? Я делал это раньше в Qt, однако я не могу использовать сигналы и слоты в Qt, потому что этот код не использует их инструмент moc.

0

Решение

Ваша ОС (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 Класс в том же порядке. Просто используйте синхронную функцию чтения, и результат будет таким же.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]