VaComm组件不会触发OnRxChar事件

时间:2011-12-06 14:04:45

标签: serial-port c++builder serial-communication c++builder-6

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方法来检查)。另外向连接的设备发送两个命令是成功的(可以在设备显示器上看到)。当输入缓冲区中有一些数据时,打开COM端口以接收OnRxChar事件还需要什么?我也不明白兄弟组件TVaBuffer的目的是什么?目前我没有使用它,可以通过方法ReadText接收数据(如上所述)。

1 个答案:

答案 0 :(得分: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");
    }
}