Компонент VaComm не запускает событие OnRxChar - PullRequest
0 голосов
/ 06 декабря 2011

Компонент 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 Ответ

2 голосов
/ 08 декабря 2011

Большинство компонентов 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");
    }
}
...