COMポート通信で断線

このQ&Aのポイント
  • VC++でプログラムを作成しています。COMポートで通信するプログラムを作っており、断線したことを検出する方法を知りたいです。
  • SetCommTimeoutsを使っても検出できず、WaitCommEventで止まってしまいます。タイマを使ってタイムアウトを検出して通信スレッドを終了させる方法を探しています。
  • TerminateThreadは最終手段と考えています。SetCommTimeoutsの使い方も教えていただけると助かります。
回答を見る
  • ベストアンサー

COMポート通信で断線

VC++でプログラムを作成しています。 COMポートで通信するプログラムを作っており、断線したことを検出するようにしたいのですが、SetCommTimeoutsを使っても検出できず、WaitCommEventで止まってしまいます(WaitCommEventで指定した待ちプログラム呼び出すことを繰り返す無限ループになってしまう)。そこから、脱出できるようなプログラミング方法はありませんでしょうか? ただし、タイマを使ってタイムアウトを検出しその通信スレッドを強制終了させるTerminateThreadは最終手段と考えています。 また、SetCommTimeoutsの使い方も説明していただけると助かります(もしかするとコレをちゃんと使えばできるのかも)。 よろしくお願い致します。

  • R360
  • お礼率69% (365/524)

質問者が選んだベストアンサー

  • ベストアンサー
  • Rikibo
  • ベストアンサー率60% (17/28)
回答No.1

タイムアウトとエラー イベントは意味合いが異なります。 まずは WaitCommEvent 呼び出しから処理が戻らない原因を突き止めるべきでしょう。 たとえばリファレンスに書いてある "hFile を開くときに FILE_FLAG_OVERLAPPED フラグをセットしなかった場合は、監視対象のイベントのいずれかが発生するか、エラーが発生するまで制御が戻りません。" に合致していないかチェックする、などです。 http://msdn.microsoft.com/library/ja/jpfileio/html/_win32_waitcommevent.asp 実装例として Platform SDK のサンプルを活用することもお勧めします。 古いサンプルが今でも手に入ります。 http://msdn.microsoft.com/library/en-us/vcsample98/html/vcsmpserialsampleforcommunicationsdemonstration.asp http://msdn2.microsoft.com/en-us/library/ms810467.aspx

R360
質問者

補足

とりあえず、タイムアウトで検出したいと思いますので、そちらの情報もいただけますでしょうかm(__)m

関連するQ&A

  • VC++でRS232C(COMポート通信)

    VC++でRS232C(COMポート)通信をするソフトを作成していますが、COMポートが開けず通信ができません。ポートが開けない理由を追跡する方法はありますか?

  • COM1ポート IRQが変わる

    RS232Cを使ってPCと制御機器の通信プログラムを作成しています。 使用言語はVC++6.0です。 CreateFile関数でCOM1ポートをOpenして使用したいのですが オープン出来ずエラーになります。 コントロールパネルのデバイスマネージャから COM1ポートのIRQを見ると4となっています。 (通常そうだと思いますが。) そこで、一度、COM1ポートを無効してPC再起動 再起動後、COM1ポートを削除してハードウエアをスキャン。 その後、COM1ポートが出ますが、その時IRQは7になっています。 その状態ではCreateFile関数を使ったCOM1ポートのオープンは 出来ます。 しかし、再度、PCを再起動するとIRQが4に戻って ポートが開けない状態になります。 また、ポートを削除して・・・IRQを7にするとポートが開ける。 再起動する度に変更したIRQが4になり、上手く使いこなせません この現象について、アドバイスいただける方いましたら よろしくおねがいします。

  • COMポートが開けません。

    Windows XP、VB6.0の環境で、 ラベルプリンタでラベル発行するプログラムを 作っています。 その際、COMポートを開こうとすると 「実行時エラー 8015 通信状態を設定できません。  通信パラメータのいずれかが不正である  可能性があります。」 というエラーが表示されます。 同じプログラムで他のマシンでは 問題なくCOMポート開けます。 何が不正なのでしょうか? どうぞ宜しくお願いします。

  • 通信ポート?

    今、話題になっている携帯とパソコンをつないで音楽データ通信をする「LISMO!」というのをやりたいのですが、毎回通信エラーが表示されるんですよ。。。 そこで、auホームページを見たところ、 「ドライバが正常にインストールされ、通信設定が正しくてもエラーが表示される場合、au Music Portが使用しようとしているCOM (通信ポート) を他のソフトウェアや周辺機器などがすでに使用している可能性があります。 常駐ソフトやスタートアップなどにある自動実行プログラム、その他、インストールされているソフトウェアで、COMポートを使用するようなプログラムなどは、全て終了してからau Music Portをお使いください。 また、終了したように見えても、バックグラウンドなどでCOMポートを使用したまま存在しているプログラムなどもありますので、それらも終了してください。」 と、書いてありました。この、通信ポートを使用するようなプログラムや他のソフトウェアの終了方法・comポートの開放方法を教えてください。

  • COMポート通信をモニターしたい

    現在、PCと組み込み系の端末との間でRS-232C通信をさせています。このRS-232C通信のTXとRXのデータのタイミングなどをモニターできるソフトはありませんでしょうか? 現在RS-232C通信をさせているのですが、組み込み系の端末側にはTCP-RS232C通信変換のモジュールを取り付けていて、PC側もTCP-RS232C変換させるソフトを使用しています。 TCP-RS232C通信変換のモジュールはWIZNET社製のWIZ110SRというのを使用しています。 PC側ではTCP-RS232C通信変換ソフトでWIZNET社製のWIZ VSPというソフトを使用して、TCPで受けたデータをRS-232Cに変換して受信プログラムソフトに転送しています。 このPC側の受信ソフトとTCPへ変換する間のCOMポートの通信をモニターできるようなソフトというものはありませんでしょうか? どうぞ、ご教授頂きますようお願い致します。

  • COMポートの同時オープン同時読み込み

    お世話になります。RS232機器で同じ仕様の計測機器を つなげて、同時に測定をしたいと考えています。 WindowsXPでVC++で作成します。 CreateFile,ReadFileで実現するかと思うのですが、 プログラミング上、まったく同一時刻に二つのCOMを 開くことは現実不可能でしょうか? 正確にいうと、同一時刻に一定量蓄積された2つのCOMバッファ から同時にPCのメモリに展開するという処理です。 計測機器同士は、シンクロケーブルがありますので ハードウェア的にタイミングを合わせて、データ出力してきます。 ということは、パソコン側では理論的にCOM1、COM2に接続された 機器からは、データが一定量蓄積される時間はともに一定時間 であるといえます。 逆にいうと、COM1、COM2からデータを同時にぬきとって やらなければ、のちのちCOM1のバッファとCOM2のバッファ でずれが生じてくるはずです。 たとえばDSPなんかですと、パイプ命令てのがあり CreateFile("COM1"...) | CreateFile("COM2"...) とすることで、2つの命令を同じ時刻にスタート可能だと 思います。(DSPにCreateFileのような命令はないですが) また、スレッドを使うという考えもありましたが、自分自身、 スレッドに対する知識がとぼしくて・・・ こうした処理をする際、ソフトウェアでの処理というのは 事実上不可能に見えてきますが、実際はなにか回避策というか 解決策があるのでしょうか? よろしくお願いいたします。

  • COM3を削除したい

    WindowsXPに、VMWarePlayerをいれUbuntuを走らせて、シリアル通信を行っいました。 その後、USBシリアルアダプタを入れたり、Bluetooth基盤を増設したりし、いつの間にか、シリアル通信が出来なくなってしまいました。 ポートのオープンは出来ているんですが、データは送られません。 Windows側でディバイスマネージャで見るとCOM1 COM9(Bluetooth)がありますが、プログラム上では、COM1、COM3、COM9、COM10が見つかります。 USBシリアルアダプタを差した場合は、COM4がディバイスマンージャに現れるので、削除しました。 VMPlayerではCOM1 COM3があると通信できない、と言う記事を見かけたので COM3を削除したいのですが、ディバイスマネージャ上にない場合、どのようにすればよいでしょうか?

  • シリアル通信をしたいのですが,わかりません

    先輩の手伝いでシリアル通信をまかされたのですが,現在プログラミングはfor文まわせるくらいでクラスとかもわかりません. ましてやポートとか意味不だし,タイムアウトとかスレッドとかも全くわからないのですが,1っ週間でやってこいということでした. シリアル通信の構造も調べても理解できないし,用語もわかりません. ネットで調べたサンプルとかも意味がわかりません.こんな俺が一週間でシリアル通信できるようになるにはどうすればいいでしょうか?ってかできますか? 一応毎日5時間くらいネットで調べているのですが,まったく手が動かないという感じです.とりあえず手を動かせといわれましたが,うごかしてもどうしようもありません.何もわからないので.どうしたらいいでしょうか. ちなみにプログラミングはまじで苦手です.というか,計算はかけますが,全体を把握できないというか,新しいライブラリとか入ってきたら意味不だし人のコードも読めません.

  • 割り込み処理のシミュレート

    現在開発している組み込み系システムのシミュレートをVCで行いたいと考えています。 組み込み系のシステムは簡単に言うと、 普段はメインループでくるくる回っており、1ms毎にタイマ割り込みが発生し、変数の値を書き換え、メインループではその変数の変化によって何か処理を実行するというものです。 このようなシステムをVCでできるだけ同じようにシミュレートするため、マルチスレッドを用いようと考えているのですが、以下の性質を実現することは可能でしょうか? ・メインスレッド実行中はタイマ割り込みスレッドは割り込み可能。 ・タイマ割り込みスレッド実行中はメインスレッドは割り込んでこない。 ・メインスレッドで特定の区間タイマ割り込みスレッドの割り込みを禁止できる。 ・高速シミュレートを行いたいため、割り込みの禁止などはできるだけ低負荷で行いたい。(ミリ秒単位だとNG) ・複数の割り込みスレッドがある場合、各スレッドごとに割り込みレベルを設け、このレベル以下を割り込み禁止など行いたい。 スレッド以外の実現方法などあればそちらもご教授願いたいです。 よろしくお願いします。

  • VC++2003の無限ループについて

    VC++2003の無限ループについて質問なんですが、スレッドを使わない方法でパソコンをフリーズさせないようにする方法がわかりませんよろしくお願いします。

専門家に質問してみよう