使用boost :: asio打开串行连接时堆栈溢出

时间:2014-06-04 23:49:49

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

我正在尝试连接到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(句柄和&amp; dcb)内。

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

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

1 个答案:

答案 0 :(得分:1)

由于你可以使用LabVIEW中的串行乐器,你的假设是你没有启动某些驱动程序或设置持久性的东西&#34; 可能是正确的。

你可以看到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