0

VaComm コンポーネントは、COM ポートを介した外部デバイスとの通信をカプセル化します。私のプログラムは、次のコードを使用して測定デバイスと通信しています:

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

次のような OnRxChar イベント ハンドラーを (フォーム デザイナーを介して) 設定しました。

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

問題は、データを受信して​​もこのイベントが発生しないことです (無限ループで TVaComm::ReadText メソッドを呼び出すことで確認できます)。また、接続されたデバイスへの 2 つのコマンドの送信に成功しました (デバイスのディスプレイで確認できます)。入力バッファにデータがある場合、COM ポートを開いて OnRxChar イベントを受信する以外に何が必要ですか? また、兄弟コンポーネント TVaBuffer の目的がわかりませんか? 現在、私はそれを使用しておらず、メソッド ReadText を介してデータを受け取ることができます (上記で書いたように)。

4

1 に答える 1

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");
    }
}
于 2011-12-07T23:37:56.853 に答える