Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ctb::SerialPort-写入时超时()_C++_Wxwidgets - Fatal编程技术网

C++ ctb::SerialPort-写入时超时()

C++ ctb::SerialPort-写入时超时(),c++,wxwidgets,C++,Wxwidgets,我正在写一个程序,可以通过COM端口控制一个科学硬件。程序本身是用wxWidgets编写的,并使用ctb库。为了测试它,在我将它连接到30万欧元的设备之前,我使用com0com(空调制解调器模拟器)转发COM2端口。为了模拟我的硬件,我使用wxTerminal(COM3)。总之,它工作得很好。人们不仅可以在VS或DB中调试,还可以在wxTerminal中查看整个数据传输 现在来谈谈我的问题。我使用将数据发送到COM端口ctb::SerialPort::Write()函数 device->W

我正在写一个程序,可以通过COM端口控制一个科学硬件。程序本身是用wxWidgets编写的,并使用ctb库。为了测试它,在我将它连接到30万欧元的设备之前,我使用com0com(空调制解调器模拟器)转发COM2端口。为了模拟我的硬件,我使用wxTerminal(COM3)。总之,它工作得很好。人们不仅可以在VS或DB中调试,还可以在wxTerminal中查看整个数据传输

现在来谈谈我的问题。我使用将数据发送到COM端口
ctb::SerialPort::Write()
函数

device->Write( (char*)line.c_str(), line.size() );
但是,如果我断开wxTerminal一侧的连接(即COM2->NULL),则程序将挂起此函数

device->Write( (char*)line.c_str(), line.size() );
很明显,我应该添加一些功能来测试我的设备是否仍然存在,但要做到这一点,我需要向它发送数据包,并期望得到一些答案。现在我回到
Write()

“以防万一”我也尝试了
ctb::IOBase::Writev(char∗ buf,size\u t len,unsigned int timeout\u in\u ms)
将超时设置为100ms,我仍然让程序挂在同一行中。这实际上是预期的行为,因为在本例中,超时仅意味着连接线被阻塞,直到传输整个缓冲区或达到超时

将wxTerminal连接到COM3会导致取消冻结调试器或独立程序。阳光明媚,鸟儿在歌唱


有人能给我一个如何克服我的问题的提示吗?如果评论仅限于wxWidgets world,我将不胜感激-我真的不想用其他工具包重新编写整个程序。

如果COM端口库没有在写块上提供有效的超时(可能是因为硬件流控制),您可以通过线程关闭写来实现自己的程序。您可以使用几个事件/信号量/condvar/任何东西。一个是向线程发出信号,表示缓冲区中有要发送的内容,另一个是可以等待的内容,线程在发送缓冲区后会发出超时信号。如果“确认”等待超时,您的COM端口将被卡住,您可以弹出一些“检查电缆”消息框。我不知道您的端口库支持哪些其他调用,因此我不知道如何实现刷新/重试。

这不是一个众所周知的库;如果您联系作者,您可能会得到更好的支持。也许您可以尝试不同的串行端口库。Asio()支持串行端口。请参阅此问题(),以获取示例链接(在其中一个答案中)。奇怪的是,每个人都认为,当他们在串行端口通电和使用时将其拔出时,应该会发生一些令人高兴的事情。但他们从来不会猛拉一个正在运行的硬盘,期望它能正常工作。追逐超时参数实现,毫无疑问,它是为了检测这一点。或使用连接器螺钉。