0

VaCommコンポーネントは、COMポート経由で外部デバイスとの通信をカプセル化します。私は(フォームデザイナを介して)OnRxCharイベントハンドラを設定しているVaCommコンポーネントは、OnRxCharイベントを起動しません。

void Form::OnButton_Click() 
{ 
    VaComm1->PortNum = param.serialComm.port; 
    VaComm1->Open(); 
    VaComm1->WriteText("bla bla\r\n"); 
    Sleep(3000); 
    VaComm1->WriteText("another bla bla"); 
} 

次のようになります:

void __fastcall TForm_Main::VaComm1RxChar(TObject *Sender, int Count) 
{ 
    AnsiString str = VaComm1->ReadText(); 
    if (!str.IsEmpty()) 
    { 
     // process received data 
    } 
} 

問題は、このイベントでも解雇されていないことである私のプログラムは、次のコードを使用して測定装置と通信していますデータが受信されたとき(無限ループでTVaComm :: ReadTextメソッドを呼び出すことでチェックできます)。また、接続されたデバイスへの2つのコマンドの送信も成功しました(デバイスの表示で確認できます)。入力バッファにデータがあるときにOnRxCharイベントを受け取るためにCOMポートを開く以外に何が必要ですか?私はまた、コンポーネントTVaBufferの兄弟の目的は何か分かりませんか?私はそれを使用していないと私は上記のようにReadTextメソッドを介してデータを受信することができます現在。

答えて

2

私が見たほとんどのCommPortコンポーネントは、非同期イベントを発生させるためにアクティブなメッセージループを持つ呼び出しスレッドに依存しています。この場合、OnButon_Click()が終了するまで、メインスレッドは新しいメッセージの処理をブロックされます。代わりに次のような方法を試してください:

void Form::OnButton_Click() 
{ 
    VaComm1->PortNum = param.serialComm.port; 
    VaComm1->Open(); 
    VaComm1->WriteText("bla bla\r\n"); 
} 

void __fastcall TForm_Main::VaComm1RxChar(TObject *Sender, int Count) 
{ 
    AnsiString str = VaComm1->ReadText(); 
    if (!str.IsEmpty()) 
    { 
     // process received data 
     if (str is a reply you are expecting) 
      VaComm1->WriteText("another bla bla"); 
    } 
} 
関連する問題