Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с ожиданием события от порта, COM-порт, WaitCommEvent 
:(
    Опции темы
ksili
Дата 26.6.2007, 05:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



У меня программа должна в порт посылать последовательность похожих команд. Причем следующая команда должна посылаться сразу же после того, как от предыдущей команды вернулось OK. Для этого перед этим для порта задаю так:
Код

 GetCommState(hCom,&DCB);
 tempch = DCB.EvtChar;
 DCB.EvtChar = 'K';
 SetCommState(hCom,&DCB);

Сигнальный символ теперь 'K'. Затем задаю маску событий:
Код

 GetCommMask(hCom,&oldMask);
 SetCommMask(hCom,EV_RXFLAG);

Теперь при появлении во входном буфере символа K будет генерироваться событие.
Собственно сами команды хочу отправлять так:
Код

 for(j=1;j<=s.Length();j++)
    {
     if(s[j]=='p')  Sleep(1000);
     else
        {
         dtmf = "AT+VTS="+s.SubString(j,1)+",1\r";
         SendCommand(dtmf,hCom);
         PurgeComm(hCom,PURGE_TXCLEAR | PURGE_RXCLEAR);
         WaitCommEvent(hCom,&wcEvent,NULL);

         ReadPort(hCom);
        }
    }

В строке s содержатся цифры и буквы p. Функции SendCommand и ReadPort. Соответственно пишут и читают в/из порта.
Код

int __fastcall TConferenceThread::SendCommand(AnsiString cmd,HANDLE port)
{
 DWORD dwWritten9;

 if(WriteFile(port, cmd.c_str(), cmd.Length(), &dwWritten9, NULL)==0)
    {
     CloseHandle(port);
     port = NULL;
     return 0;
    }
 PurgeComm(port,PURGE_TXCLEAR | PURGE_RXCLEAR);
 return 1;
}
//---------------------------------------------------------------------------
int __fastcall TConferenceThread::ReadPort(HANDLE port)
{
 char buffer1[100];
 int i;
 DWORD dwRead9;                                      

 memset(buffer1,0,100);
 if(ReadFile(port, buffer1, sizeof(buffer1), &dwRead9, NULL)==0)
    {
     CloseHandle(port);
     port = NULL;
     return 1;
    }

 if(dwRead9)
    {
     for(i=3;i<strlen(buffer1);i++)
        {
         if(buffer1[i]=='\n'||buffer1[i]=='\r') buffer1[i] = to4ka;
        }
     PurgeComm(port,PURGE_TXCLEAR | PURGE_RXCLEAR);
     All_ch->chnls[this_ch].log->Add((AnsiString)buffer1);    //выводим в лог то, что получили от порта
     return 0;
    }
 return 1;
}

Так вот, так не получается. WaitCommEvent не ждёт появления на входе символа 'K', а сразу идёт дальше. Пришлось извратиться вот так:
Код

 for(j=1;j<=s.Length();j++)
    {
     if(s[j]=='p')  Sleep(1000);
     else
        {
         dtmf = "AT+VTS="+s.SubString(j,1)+",1\r";
         SendCommand(dtmf,hCom);
         PurgeComm(hCom,PURGE_TXCLEAR | PURGE_RXCLEAR);
         do
            {
             WaitCommEvent(hCom,&wcEvent,NULL);
            }while(wcEvent!=EV_RXFLAG);

         ReadPort_2(hCom);
        }
    }

Я не понимаю, я что-то не так делаю или только так с этой функцией и приходится работать? По-моему, раз уж она так называется, то она должна ждать события, а не просто проверять наличие этого события в текущий момент.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.