ctb :: SerialPort - Write()中的超时

时间:2012-01-06 18:07:50

标签: c++ wxwidgets

我正在编写应该通过COM端口控制一块科学硬件的程序。程序本身是用 wxWidgets 编写的,并使用 ctb 库。为了测试,在我将它连接到300k€设备之前,我使用 com0com (Null-modem仿真器)来转发COM2端口。要模拟我的硬件,我使用 wxTerminal (COM3)。总之它很好用。不仅可以在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)并将超时设置为100毫秒,我仍然将程序挂在同一行。它实际上是预期的行为,因为在这种情况下 timeout 仅表示连接线被阻塞,直到传输完整个缓冲区或达到超时

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

有人可以给我一个如何克服我的问题的提示吗?我很感激如果评论会被限制在wxWidgets-world中 - 我真的不想用其他工具包重写整个程序。

1 个答案:

答案 0 :(得分:0)

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