0

VaComm组件通过COM端口封装与外部设备的通信。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"); 
} 

我已经设置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方法接收数据(正如我上面所写)。

回答

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"); 
    } 
}