【问题标题】:Stack overflow when opening a serial connection using boost::asio使用 boost::asio 打开串行连接时堆栈溢出
【发布时间】:2014-06-04 23:49:48
【问题描述】:

我正在尝试连接到 COM3 上的设备,并且代码一直运行,直到我调用 open("COM3"),这会导致堆栈溢出。以下是相关代码:

asio::io_service io;
asio::basic_serial_port<asio::serial_port_service> scope(io);

//Open the connection and configure it
cout << "OPENING\n";
system::error_code error;
scope.open(PORT, error);

打开连接后,我用波特率等配置它。

它挂在 Win_iocp_serial_port_service.ipp 中,在 SetCommState(handle, &dcb) 内部。

我还有一些 labview 代码来连接、发送命令和断开连接,这些代码可以正常工作。如果我在启动计算机后运行了 labview 代码,那么我的 C++ 程序可以工作(连接时不会挂起),但是如果我还没有运行 labview 代码,它会给我一个堆栈溢出。这让我觉得我没有启动一些驱动程序或设置一些持久的东西,但我不确定它会是什么。 如果有人遇到此问题或有任何见解,我感谢您的帮助!

来自进一步测试的信息:从非 labview 串行连接客户端连接似乎也可以启用 boost 连接。如果我首先通过超级终端连接它可以工作,如果我通过命令行连接(根据本指南https://learn.sparkfun.com/tutorials/terminal-basics/command-line-windows-mac-linux),那么我随后也可以通过 boost 连接,这可能是一个可行的解决方案,即使它很愚蠢。不幸的是,我无法使用 System.IO.Ports.SerialPort 成功发送数据,因此临时解决方案是使用 System.IO.Ports.SerialPort 连接,断开连接,然后使用 boost asio 连接,因为它可以工作。这工作得相当好,但代码现在只能在 Windows 上工作。

【问题讨论】:

  • 这是在 Windows 上吗?您的串行端口是“真实”端口还是 USB/串行适配器之类的东西?如果您在程序之前在端口上运行了 Labview 以外的程序,但在重新启动之后会怎样?
  • 它在 Windows 上,带有 USB/串行适配器。我还没有尝试使用其他程序先进行连接——这是个好主意。我去看看!
  • 我会让你知道那些 USB 适配器是片状的。如果您有时拔掉它们,它们会进入睡眠状态,并且似乎会更改端口号。我打赌 Labview 正在做一些事情来戳适配器并让它醒来。除了那个提示(这甚至可能没有帮助)我没有更多的东西给你......祝你好运!
  • 我用超级终端对其进行了测试,它与labview具有相同的功能。即重新启动后连接良好,之后我的 c++ 程序也可以连接。我会四处寻找,看看是否能找到有关适配器进入睡眠/如何唤醒它的任何信息......谢谢!

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


【解决方案1】:

由于您可以使用 LabVIEW 中的串行仪器,您的假设“没有启动某些驱动程序或设置持久性”可能是正确的。

您可以看到 LabVIEW 和 VISA 如何使用 NI 提供的名为 I/O Trace [1] 的工具配置端口和发送命令。一旦您掌握了工作设置和命令,您就可以将它们与您对boost::asio 的调用进行匹配,并确定您是否过度配置了端口。

在 I/O 跟踪日志中,您会看到 VISA 在打开会话之前设置了波特率、流量控制和其他特征。但是,驱动程序共享的内容不多,因此,如果您的程序使用相同的设置和序列但仍然挂起,那么请仔细检查您是如何对asio 接口进行编程的[2]。

参考文献

[1] 执行良好的 NI I/O 跟踪捕获以进行调试/故障排除
http://digital.ni.com/public.nsf/allkb/282C5D41E2BA04F2862574BA007803B9

[2] 串口和 C++
http://www.webalice.it/fede.tft/serial_port/serial_port.html

【讨论】:

    猜你喜欢
    • 2010-11-09
    • 2022-09-24
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多