2012-01-06 26 views
0

私はCOMポート経由で科学的なハードウェアを制御するプログラムを作成しています。プログラム自体はwxWidgetsで書かれており、ctbライブラリを使用しています。テストするには、それを300k€機器に接続する前に、私はcom0com(ヌルモデムエミュレータ)を使用してCOM2ポートを転送します。ハードウェアをエミュレートするには、wxTerminal(COM3)を使用します。それは素晴らしい作品です。 VSまたはDBだけでなく、データ転送全体をwxTerminalに表示することもできます。ctb :: SerialPort - タイムアウト(書き込み)

問題が発生しました。私はCOMポートctb::SerialPort::Write()機能にデータを送信するために使用します。

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

IがプログラムよりwxTerminalすなわち COM2-> NULL)の側に接続を切断する場合は、この機能に掛かります。

私の装置がまだ存在するかどうかをテストするためにいくつかの機能を追加する必要がありますが、データパケットを送信して何らかの回答が必要なことは明らかです。だから私はWrite()に戻る。

「まあまあ」私もctb::IOBase::Writev (char ∗ buf, size_t len, unsigned int timeout_in_ms)タイムアウトを100msに設定しましたが、私はまだ同じ行にハングしています。この場合の実際の動作はです。タイムアウトは、バッファ全体が転送されるか、タイムアウトに達するまで接続ラインがブロックされていることを意味します。

COM3にwxTerminalを接続すると、デバッガまたはスタンドアロンプ​​ログラムがフリーズすることがあります。太陽が輝き、鳥たちが歌います。

誰かが私の問題を克服するヒントを教えてくれますか?コメントがwxWidgets-worldに制限されているのであれば、私は感謝しています - 私は本当に他のツールキットでプログラム全体を書き直したくありません。

+0

これはよく知られたライブラリではありません。あなたが著者に連絡すればより良いサポートを得るかもしれません。おそらく、あなたは別のシリアルポートライブラリを試すことができます。 Boost.Asio(http://www.boost.org/doc/libs/release/doc/html/boost_asio.html)はシリアルポートをサポートしています。例へのリンク(回答の1つ)については、この質問(http://stackoverflow.com/questions/267752/boost-asio-serial-port-need-help-with-io)を参照してください。 –

+0

電源が入っていて使用中にシリアルポートからコネクタを外してしまったら、誰もが幸せにならないと誰もが思っています。しかし、彼らは走っているハードドライブを決して揺さぶることはなく、*動作させることを期待している。タイムアウト引数の実装を追跡すると、これを検出することは間違いありません。または、コネクタのネジを使用してください。 –

答えて

0

COMポートライブラリが書き込みブロックで有効なタイムアウトを提供しない場合(たぶんハードウェアフロー制御のため)、書き込みをスレッドオフにすることで独自の方法を実装できます。いくつかのイベント/セマフォー/コンデバー/何でも使用できます。 1つは、送信するバッファに何かがあることをスレッドに通知するものと、バッファを送信した後にスレッドによって通知されるタイムアウトを待つことができるものです。 'ack'待ち時間が切れると、あなたのCOMポートが停止し、あなたはいくつかの 'Check cable'メッセージボックスをポップアップすることができます。あなたのポートlibがサポートしているものが何であるかわからないので、どのようにフラッシュ/再試行を実装できるかはわかりません。

関連する問題