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