从串行端口

时间:2020-04-22 11:13:39

标签: c++ windows serial-port boost-asio

我正在使用boost :: asio :: async_read_until函数从Windows 10中的串行端口读取。定界符是Regex模式。只要接收到的数据不大于512字节,它就可以正常工作。

如果接收到的数据大于512字节,则将其简单地截断,并且不会再次调用“ readComplete”函数。但是,如果我发送更多数据,则1字节就足够了,丢失的数据将与新数据一起接收。

我在tcp / socket上使用了相同的实现,并且可以完美地工作。 Windows中的本机串行接口是否有任何限制导致此行为?

编辑1:我注意到,如果波特率从115200降低到28800,则不会丢失任何数据。

// from .h-file: boost::asio::streambuf streamBuf_;

void RS232Instrument::readAsyncChars()
{
   boost::asio::async_read_until(
      serial_,
      streamBuf_,
      boost::regex(regexStr_.substr(6, regexStr_.length() - 7)),
      boost::bind(
         &RS232Instrument::readComplete,
         this,
         boost::asio::placeholders::error,
         boost::asio::placeholders::bytes_transferred));
}

void RS232Instrument::readComplete(const boost::system::error_code& error, size_t bytes_transferred)
{   
   if(error)
   {
     // Error handling
   }
   else
   {
      std::string rawStr(
         boost::asio::buffers_begin(streamBuf_.data()),
         boost::asio::buffers_begin(streamBuf_.data()) + bytes_transferred);

      // Log the data in rawStr....

      // Remove data from beginning until all data sent to log
      streamBuf_.consume(bytes_transferred);

      if(abort_ == false)
      {
         readAsyncChars();
      }
   }
}

1 个答案:

答案 0 :(得分:0)

由于我发现是由这个问题引起的,所以我会自己回答问题。

为了清楚起见,我在上面省略了一些代码,但我没有意识到的代码实际上是问题所在。 遗漏的代码示例:

LOG_DEBUG(“收到Rs232数据”);

我使用boost:log功能,并且在日志框架中添加了更多的“接收器”。在这种情况下使用的接收器记录到ram中的向量,并在从用户输入触发时打印到控制台。

事实证明,在调用接收器中的“消费”功能之前,日志框架耗时约1毫秒。使用async_read_until时,这足以导致串行端口上的数据丢失。

经验教训:不要在async_read_until的处理程序函数中调用任何耗时的任务

相关问题