0

我正在尝试使用 boost 库在 C++ 中连接一个信号和一个插槽。我的代码当前打开一个文件并从中读取数据。但是,我正在尝试改进代码,以便它可以使用串行端口实时读取和分析数据。我想做的是仅在串行端口中有可用数据时才调用分析函数。

我该怎么做呢?我以前在 Qt 中做过,但是我不能在 Qt 中使用信号和插槽,因为这段代码不使用他们的 moc 工具。

4

1 回答 1

0

您的操作系统(Linux)在处理串行端口时为您提供了以下机制。

您可以将串行端口设置为非规范模式(通过取消设置结构ICANON中的标志termios)。然后,如果inMINTIME参数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()仅在新数据到达时才处于活动状态。其余时间操作系统将保持该线程处于等待状态。因此它不会消耗CPU时间。如何实现实际signal部分取决于您。

上面的示例使用常规read系统调用从端口获取数据,但您可以boost以相同的方式使用该类。只需使用同步读取功能,结果将是相同的。

于 2013-07-05T16:17:43.593 回答