【发布时间】: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