【问题标题】:Emitting signal when bytes are received in serial port串口接收到字节时发出信号
【发布时间】:2013-07-05 14:50:41
【问题描述】:

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

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

【问题讨论】:

  • 你使用的是什么操作系统?
  • 您能否更详细地描述您实际遇到的问题?检测到你在串口收到了东西,或者如何使用boost::signal,或者别的什么?
  • 我正在为如何编码而苦苦挣扎。就像如何在串口上使用 boost::signal 一样,当串口收到字节时,就会调用一个函数。我希望它在不使用 Qt 的情况下像 Qt 信号和插槽一样。

标签: c++ boost serial-port signals slot


【解决方案1】:

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

您可以将串行端口设置为非规范模式(通过取消设置 termios 结构中的 ICANON 标志)。然后,如果c_cc[] 中的MINTIME 参数为零,则当且仅当串行端口输入缓冲区中有新数据时,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 类。只需使用同步读取功能,结果将是相同的。

【讨论】:

  • 非常感谢。如何取消设置 ICANON 标志并设置 c_cc[] 中的 MIN 和 TIME 参数?
  • 没关系,我想通了。所以我目前正在运行您的代码,但实际上并没有打印任何字节。我打开了端口,它工作正常,并按照您的指示设置了所有设置。但是,它不会读取数据。
  • 在处理串口时需要考虑很多事情。您必须在两个端口上设置相同的波特率、数据位和奇偶校验。至少对于初始测试,最好禁用流控制。所有这些设置都是在“termios”结构中完成的。对于嵌入式系统,可能需要设置串口模式(RS232、RS485、RS422)。此类端口也将具有非标准引脚布局。如果您使用的两个端口上的所有设置都正确,但仍然没有数据,请确保发送应用程序确实在发送数据并且电缆正确
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多