※ ChatGPTを利用し、要約された質問です(原文:VB2005でWin32APIを用いてRS-232CのRTS信号を、デ)
VB2005でWin32APIを用いてRS-232CのRTS信号を、データ送信中だけHIGHにさせるプログラムを作成中です。
このQ&Aのポイント
質問者はVB2005でWin32APIを使ってRS-232CのRTS信号をデータ送信中だけHIGHにさせるプログラムを作成中であり、上手く動作しない問題に直面している。
質問者はCreateFile()関数を使ってCOMポートを開き、EscapeCommFunction()でRTS信号をHIGHに設定し、WriteFile()関数でデータを送信しているが、WaitCommEvent()関数がデータ送信完了を待たずに抜けてしまうという問題が発生している。
質問者はWaitForSingleObject()を使ってイベントハンドラがシグナル状態になるのを待つが、タイムアウトの値を設定するとうまく動作しないという問題が発生している。解決策を求めている。
VB2005でWin32APIを用いてRS-232CのRTS信号を、デ
VB2005でWin32APIを用いてRS-232CのRTS信号を、データ送信中だけHIGHにさせるプログラムを作成中です。
色々調べて、Win32APIを使うことで、それらしい動作をさせるプログラムを作れることが分かり、色々調べてコーディングしたのですが、上手く動きません…。処理の流れは以下のようになっています。
(1) CreateFile()関数でCOMを開く。
(CreateFile()の「フラグ」には"FILE_FLAG_OVERLAPPED"を指定)
(2) CreateEvent()関数にてイベントオブジェクトを作成。
(3) EscapeCommFunction()でRTS信号をHIGHに設定。
(4) WriteFile()関数でRS-232Cへデータを送信する。
※ここまでは、オシロスコープにて正しく動作していることを確認しています。
(5) データ送信完了を待つために、SetCommEvent()関数で"EV_TXEMPTY"イベントマスクをセット。
(6) WaitCommEvent()で送信完了を待つ。
⇒WaitCommEvent()関数が、データ送信完了を待たずに抜けてきてしまう(Falseがリターンされる)…。
(7) そこで、WaitForSingleObject()を使ってイベントハンドラが"シグナル状態"になるのを待つ。
⇒タイムアウトに"INFINITE"を指定すると、無限待ち状態に陥ってしまう。
⇒また、タイムアウトに"1000"を指定すると、約1秒後に"WAIT_TIMEOUT"が返ってきてしまう。
WriteFile()関数、そしてWaitCommEvent()関数の引数には、OVERLAPPED構造体へのポインタを渡しているのですが、思うように動いてくれません。
※Win32APIの関数宣言の記述方法(データ型など)が誤って、このようになっていたりするのでしょうか…
どなたかヒントでもお教えいただけると、大変助かります。
以上、よろしくお願いいたします。
補足
ご回答ありがとうございます。 仰る通り、GetLastErrorの返り値は "ERROR_IO_PENDING"です。 この返り値は、正しいのだと思うのですが、 その後、While文で"WaitForSingleObject()"を繰り返し呼び出し、 シグナル状態になるのを待っているのですがこのWhile文を抜けることができません。 ※"WaitForSingleObject()"の返り値が"0"になれば、While文を抜けるようコーディングしています。 > RTS信号使うのであればわざわざ自分でコントロールする必要ないはずです > (フロー制御としてRTSCTSを選択すれば勝手にやってくれるはず) これは、何かの設定をすれば、プログラム側からRS-232Cへデータ送信している間にだけ、RTS信号をHIGHにすることが出来る、ということでしょうか??