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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему PurgeComm() иногда не сбрасывает буферы? синхронная работа с COM-портом 
:(
    Опции темы
ksili
Дата 7.2.2007, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здравствуйте.

Я посылаю команды в COM-порт (подключён модем Acorp 56000) и читаю посылаемые от модема ответы. Вот код обработки одной такой команды
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 char buffer1[100],buffer2[100];
 DWORD dwRead8, dwWritten8;

 if(WriteFile(hCom8, "ATZ\r", 4, &dwWritten8, NULL)==0)
    {
     Application->MessageBoxA("error","Error",MB_OK);
     CloseHandle(hCom8);
     return;
    }

 Sleep(1);
 PurgeComm(hCom8,PURGE_TXCLEAR + PURGE_RXCLEAR);      

 if(ReadFile(hCom8, buffer1, sizeof(buffer1), &dwRead8, NULL)==0)
    {
     Application->MessageBoxA("error","Error",MB_OK);
     CloseHandle(hCom8);
     return;
    }

 Memo1->Lines->Add(buffer1);
}


Следом посылаю более длиные команды ("AT+FCLASS=8", "AT+VLS=11", "AT217=125") и сооветственно делаю задержку для них побольше: Sleep(50).
Проблема в том, что с какого-то момента вместо просто ответа "\r\nOK\r\n" стал приходить "ATZ\r\nOK\r\n". Я так понимаю, что PurgeComm(...) не полностью очищает буферы. Замена флагов на PURGE_RXCLEAR ничего не меняет, при замене на PURGE_TXCLEAR в строку ответа добавляется мусор.
Кроме того, команды после ATZ вообще перестали выполняться - не возвращают ни OK, ни ERROR. Замена задержек на более длинные результата не дала.
Да и вообще с самого начала как-то очень медленно всё работало - ответ на каждую команду от модема приходит через секунды две. В HyperTerminal'e ответ на эти же команды приходит сразу же.





--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 7.2.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



С тормозами разобрался: поставил таймауты меньше. Сейчас такие:
Код

 CommTOuts.ReadIntervalTimeout          = 0;
 CommTOuts.ReadTotalTimeoutMultiplier   = 0;
 CommTOuts.ReadTotalTimeoutConstant     = 1000;
 CommTOuts.WriteTotalTimeoutMultiplier  = 0;
 CommTOuts.WriteTotalTimeoutConstant    = 1000;

Кстати нигде не встречал пояснений как вообще определяться с этими таймаутами

Но главная проблема всё же осталась - в большинстве случаев от модема приходит ответ "ATZ\r\nOK\r\n" вместо "\r\nOK\r\n" и последующие команды не выполняются.


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 8.2.2007, 07:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

 if(WriteFile(hCom8, "AT+FCLASS=8\r", 12, &dwWritten8, NULL)==0)
    {
      //обработка ошибки
    }
 PurgeComm(hCom8,PURGE_TXCLEAR + PURGE_RXCLEAR);      
 
 WaitCommEvent(hCom8,&wcEvent,NULL); //ожидаем первый символ в буфере, потом читаем в синхр. режиме

 PurgeComm(hCom8,PURGE_TXCLEAR|PURGE_RXCLEAR);
 Sleep(100);
 if(ReadFile(hCom8, buffer1, sizeof(buffer1), &dwRead8, NULL)==0)
    {
      //обработка ошибки
    }

В buffer1 получаю "AT+FCLASS=8\r\r\nOK\r\n". А иногда ответ вобще пустой (хотя WaitCommEvent срабатывает - странно...).

Может я вообще что-то не так делаю?




--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 8.2.2007, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробовал ещё так:
Код

  SetCommMask(hCom8,EV_TXEMPTY);
  if(WriteFile(hCom8, "AT+FCLASS=8\r", 12, &dwWritten8, NULL)==0)
    {
      //обработка ошибки
    }

 WaitCommEvent(hCom8,&wcEvent,NULL);                             //ждём когда всё уйдёт
 PurgeComm(hCom8,PURGE_TXCLEAR + PURGE_RXCLEAR);      // чистим буферы
 SetCommMask(hCom8,EV_RXCHAR);                                      
 WaitCommEvent(hCom8,&wcEvent,NULL);                             //ждём когда придёт первый символ

 if(ReadFile(hCom8, buffer1, sizeof(buffer1), &dwRead8, NULL)==0)
    {
      //обработка ошибки
    } 

Ответ стал всегда приходить, но с эхом команды.  smile Заметил ещё, что в конце ответа добавляется один непечатный символ, типа 0x12. Или даже несколько символов.


А прикольно с самим собой переписываться 

Это сообщение отредактировал(а) ksili - 8.2.2007, 08:03


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
ksili
Дата 8.2.2007, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



От мусора в конце избавился обнулением buffer1 в самом начале


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
takedo
Дата 8.2.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 501
Регистрация: 1.6.2005

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



Слушай, я может и уже ничего не понимаю, но по моему лучше писать 
так:
PurgeComm(hCom8,PURGE_TXCLEAR | PURGE_RXCLEAR); 
чем с '+' ???


--------------------
я не гольфист - я хоккеист
PM MAIL   Вверх
ksili
Дата 9.2.2007, 05:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробовал - не помогло


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
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.2468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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