我正在尝试使用boost库连接C ++中的信号和插槽。我的代码当前打开一个文件并从中读取数据。但是,我正在尝试改进代码,以便它可以使用串行端口实时读取和分析数据。我想要做的是只有在串口中有数据可用时才调用analyze函数。
我该怎么做呢?我以前在Qt中做过,但是我不能在Qt中使用信号和插槽,因为这段代码不使用他们的moc工具。
答案 0 :(得分:0)
您的操作系统(Linux)在处理串口时为您提供以下机制。
您可以将串行端口设置为非规范模式(通过在ICANON
结构中取消设置termios
标志)。然后,如果MIN
中的TIME
和c_cc[]
参数为零,则read()
函数将返回当且仅当串行端口输入缓冲区中有新数据时(请参阅{ {1}}手册页了解详情)。因此,您可以运行一个单独的线程来负责获取传入的串行数据:
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
}
}
的线程才会处于活动状态。其余的时间OS将使该线程保持等待状态。因此它不会消耗CPU时间。由您决定如何实现实际的read()
部分。
上面的示例使用常规signal
系统调用从端口获取数据,但您可以以相同的方式使用read
类。只需使用同步读取功能,结果就是一样。