2012-01-06 16 views
0

我正在編寫應該通過COM端口控制一塊科學硬件的程序。該程序本身寫入wxWidgets並使用ctb庫。爲了測試,在連接到300k€設備之前,我使用com0com(空調制解調器模擬器)轉發COM2端口。爲了模擬我的硬件,我使用wxTerminal(COM3)。總的來說,它很好。不僅可以在VS或DB中進行調試,還可以在wxTerminal中查看整個數據傳輸。ctb :: SerialPort - Write()中的超時

現在我的問題。我用來發送數據到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和我還有程序掛在同一條線上。實際上預期的行爲,因爲在這種情況下,超時意味着連接線被阻塞,直到整個緩衝區被傳送或者超時被達到。

wxTerminal連接到COM3可以解除調試器或獨立程序的凍結。太陽正在閃耀,鳥兒在唱歌。

有人可以給我一個提示如何克服我的問題?我會很感激,如果意見將被限制在wxWidgets世界 - 我真的不想用其他工具包重新編寫整個程序。

+0

這不是一個知名的圖書館;如果您聯繫作者,您可能會得到更好的支持。也許你可以嘗試一個不同的串口庫。 Boost.Asio(http://www.boost.org/doc/libs/release/doc/html/boost_asio.html)支持串行端口。看到這個問題(http://stackoverflow.com/questions/267752/boost-asio-serial-port-need-help-with-io)作爲示例的鏈接(在其中一個答案中)。 – 2012-01-06 19:39:52

+0

奇怪的是,大家都認爲,當它在通電和使用時從串口拔出一個連接器時應該會發生一些快樂。但他們永遠不會推動運行的硬盤驅動器,並期望*那*工作。追逐超時參數的實現,這無疑意味着要檢測到這一點。或者使用連接螺絲。 – 2012-01-06 19:49:41

回答

0

如果你的COM端口庫沒有在寫入塊上提供有效的超時(可能是因爲硬件流控制),你可以通過關閉寫入來實現你自己的。你可以使用一些事件/信號/ condvar/whatever。一個是向線程發出信號,告訴緩衝區中有什麼要發送,另一個是你可以等待一個超時,在線程發送緩衝後發出超時。如果「確認」等待超時,則COM端口卡住,您可以彈出一些「檢查電纜」消息框。我不知道你的port lib支持哪些其他調用,所以我不知道如何實現刷新/重試。