c++ - 重新连接设备后 boost::asio::serial_port 读取

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

我在从 GPS 设备(USB 串行)读取 boost::asio::serial_port 类时遇到问题。连接设备并从中读取数据工作正常,但是当我断开并重新连接设备时,read_some 不会从端口读取任何字节。

由于 boost 无法检测到串行端口已消失( is_open() 返回 true ),因此当我没有获取数据时,我会定期取消()、关闭()和打开( GPS_PORT )设备,重置途中的港口选项。但这也没有帮助,输入缓冲区保持为空。

我是否遗漏了什么,或者做错了什么,或者这是 asio 中的错误?有没有标准方法来检测端口是否消失?

最佳答案

很难说出您的情况的确切原因是什么,但实践表明您经常需要禁用串行端口上的 RTS 敏感性。

RTS 是真正的 RS-232 接口(interface)上的引脚,当另一侧的设备打开时,该引脚就会打开。

serial_port::read_some 调用查看此信号的底层 Windows API 函数。

由于您没有真正的 RS-323 设备,因此您需要依赖此信号的驱动程序模拟,这可能会出现错误(不幸的是经常出现错误)。

要禁用它,请调用 serial_port::set_option(DCB),并将 RTSControl 设置为 RTS_CONTROL_DISABLE

如果 close()'ing 你的句柄没有帮助,则可能是 boost 出现问题。 close() 的源代码如下所示:

  boost::system::error_code close(implementation_type& impl,
      boost::system::error_code& ec)
  {
    if (is_open(impl))
    {
      if (!::CloseHandle(impl.handle_))
      {
        DWORD last_error = ::GetLastError();
        ec = boost::system::error_code(last_error,
            boost::asio::error::get_system_category());
        return ec;
      }

      impl.handle_ = INVALID_HANDLE_VALUE;
      impl.safe_cancellation_thread_id_ = 0;
    }

    ec = boost::system::error_code();
    return ec;
  }

,i。 e.如果 CloseHandle() 由于某种原因失败(或挂起),则内部句柄值不会分配给 INVALID_HANDLE_VALUE 并且 is_open() 将始终返回true

要解决此问题,请在 close() 之后立即检查 is_open(),如果返回 true,则销毁整个实例boost::asio::serial_port 并再次创建它。

关于c++ - 重新连接设备后 boost::asio::serial_port 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/541062/

相关文章:

c++ - 向现有多索引容器添加更多索引

c++ - boost::condition 不存在 - condition 不是 boost 的成员

c++ - 以引用作为值的 std::unordered_map 不起作用?

tcp - 如何使用 (GPRS)sim900 调制解调器发送 MQTT 'Publish' 数据包?

C++链接器错误LNK2005已在SDL中定义

c++ - 在 C++ 中创建 MakeFile

iOS - 蓝牙到串口设备 - 可以吗?

go - 无法通过串口解析GPS信息

c++ - 多个嵌套 for 循环与单个 for 循环

c++ - 大小为 0 的数组