ctb::SerialPort - time-out in Write()

ctb::SerialPort - time-out in Write()

本文关键字:Write in time-out SerialPort ctb      更新时间:2023-10-16

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

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

device->Write( (char*)line.c_str(), line.size() );

然而,如果我断开wxTerminal一侧的连接(COM2->NULL),则程序将挂起该函数。

很明显,我应该添加一些功能来测试我的设备是否还在,但要做到这一点,我需要向它发送数据包,并期待一些答案。所以我回到Write()

"以防万一"我也尝试过ctb::IOBase::Writev (char ∗ buf, size_t len, unsigned int timeout_in_ms)超时设置为100ms,但我仍然有程序挂在同一行。这实际上是预期的行为,因为在这种情况下,timeout只意味着连接线被阻塞,直到整个缓冲区被传输或达到timeout

wxTerminal连接到COM3会导致调试器或独立程序的取消冻结。太阳在照耀,鸟儿在歌唱。

有人能告诉我如何克服我的问题吗?如果评论仅限于wxWidgets世界,我将不胜感激——我真的不想用其他工具包重写整个程序。

如果COM端口库没有在写块上提供有效的超时(可能是因为硬件流控制),则可以通过线程关闭写来实现自己的超时。您可以使用几个事件/信号量/condvar/任何东西。一个是向线程发出缓冲区中有东西要发送的信号,另一个是可以等待线程发送缓冲区后发出的超时信号。如果"ack"等待超时,则COM端口被卡住,您可以弹出一些"Check cable"消息框。我不知道您的端口库支持什么其他调用,所以我不知道如何实现刷新/重试。