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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложени повисает при ожидании слов от com-порта, Виртуальный com-порт на базе USB-девайса 
:(
    Опции темы
BBulat
Дата 9.9.2008, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте! 
У меня USB-девайс реализует виртуальный COM-порт. С помощью приложения я открываю драйвер моего девайса как COM-порт, произвожу туда запись. Если в девайс отвечает сразу, то приложение производит считывание данных от девайса, но если девайс отвечает с определенной задержкой, то приложение повисает.

Код

//ожидание  подтверждения от девайса 
unsigned char buf_r[12];
DWORD lpErr;
COMSTAT comstat; 
DWORD AvaibleBytes;
DWORD RealRead;    
Success = ClearCommError(port, &lpErr, &comstat); //Возвращает состояние порта и код ошибок    
if(!Success) {    pDoc->StringData1 += " port failed";    } 
else {    pDoc->StringData1 += " port success"; } 
AvaibleBytes = 0;
while(AvaibleBytes<2){AvaibleBytes = comstat.cbInQue;}
Success = ReadFile(port, &buf_r, 2, &RealRead, NULL);
 
Приложение повисает на строчке  while(AvaibleBytes<2){AvaibleBytes = comstat.cbInQue;}.
Почему так происходит?
PM MAIL   Вверх
deniska
Дата 9.9.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 0



почему? ну наверно потому что AvaibleBytes получается всегда меньше двух....
условие изменить зщначит надо
PM MAIL ICQ   Вверх
BBulat
Дата 9.9.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


Опытный
**


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

Репутация: нет
Всего: 0



значит в случае задержки в comstat.cbInQue возвращается числ меньшее 2 выходит мертвый цикл. во-первых поменять условие(может алгоритм), а во-вторых вынести работу с портом в отдельный поток чтоб GUI не повисал
PM MAIL ICQ   Вверх
ama_kid
Дата 9.9.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

Репутация: 5
Всего: 95



BBulat, у тебя в цикле не происходит обновления значения comstat.cbInQue (а должно)...
И вообще, по-хорошему чтение данных из девайса надо вынести в отдельный поток, чтобы не вешать приложение...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
BBulat
Дата 9.9.2008, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дело в том, что мое приложение больше ничего не делает, а только ждет ответа от девайса, поэтому в потоке оно точно также ждет. 
А как обновлять значение comstat.cbInQue?
PM MAIL   Вверх
ama_kid
Дата 9.9.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

Репутация: 5
Всего: 95



Цитата(BBulat @  9.9.2008,  13:23 Найти цитируемый пост)
поэтому в потоке оно точно также ждет
в потоке будет ждать только поток, но не весь процесс.

Цитата(BBulat @  9.9.2008,  13:23 Найти цитируемый пост)
А как обновлять значение comstat.cbInQue?
Ну, например, так же, как ты делаешь это несколькими строчками выше:
Код
Success = ClearCommError(port, &lpErr, &comstat); //Возвращает состояние порта и код ошибок 




--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
BBulat
Дата 9.9.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



я так сделал, не помогает:
Код

while(AvaibleBytes<2)
{
    AvaibleBytes = comstat.cbInQue;
    Success = ClearCommError(port, &lpErr, &comstat);
}

Также виснет.
PM MAIL   Вверх
ama_kid
Дата 9.9.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

Репутация: 5
Всего: 95



Цитата(BBulat @  9.9.2008,  13:38 Найти цитируемый пост)
Также виснет. 
во-первых, вставь хотя бы sleep(100); в конец цикла, а во вторых, виснет до получения информации из девайса или навсегда? Если первое - тогда это будет в любом случае до тех пор, пока ты не вынесешь чтение данных из девайса в отдельный поток. Если второе - тогда надо смотреть весь код целиком, видимо есть какое-то влияние остальной части приложения (хотя не похоже)...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
BBulat
Дата 9.9.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо) теперь не виснет даже без sleep()! Правда ща данные возвращает не те, но буду разбираться))) Спасибо!
PM MAIL   Вверх
BBulat
Дата 10.9.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



  Извиняюсь, что еще раз поднимаю тему, но возникла очередная проблема) Приложение теперь не повисает, и как только от ком-порта приходит ответ, приложение выводит на экран данные, но эти данные всегда одинаковы, независимо от того, что передает СОМ-порт. 
  Дело в том, что мое устройство, имитирующее виртуальный ком-порт, считывает данные с некоторой шины, а потом передает их по усб-порту на комп. Так вот, если на этой некоторой шине сначала появятся данные, а потом устройство считает их и передаст компу, то мое приложение выводит именно то, что появилось на шине. Но, если я сначала запущу свое устройство в режим сканирования шины и соответственно мое приложение будет ожидать ответ от устройства, то когда появляются данные на шине, приложение уже выводит совсем другие числа (всегда одно и тоже).   
  В прошивке устройства, на мой взгляд ошибок нет, есть подозрения, что данные теряются, когда приложение выходит из ожидания данных от ком-порта. Может ли такое быть?
Код приложения, связанный с ожиданием данных от ком-порта:
Код

                                                unsigned char CommandW[2];
                Sleep(1);
                Success = ClearCommError(port, &lpErr, &comstat); //Возвращает состояние порта и код ошибок    
                AvaibleBytes = 0;
                while(AvaibleBytes<2)
                {
                    AvaibleBytes = comstat.cbInQue;
                    Success = ClearCommError(port, &lpErr, &comstat);
                }
                Success = ReadFile(port, &CommandW, 2, &RealRead, NULL); 
                
                pDoc->StringData1 += " Данные на шине:";
                text.Format("%d", CommandW[0]);
                pDoc->StringData1 += text;
                text.Format("%d", CommandW[1]);
                pDoc->StringData1 += text;

PM MAIL   Вверх
ama_kid
Дата 10.9.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


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

Репутация: 5
Всего: 95



Цитата(BBulat @  10.9.2008,  13:06 Найти цитируемый пост)
 В прошивке устройства, на мой взгляд ошибок нет, есть подозрения, что данные теряются, когда приложение выходит из ожидания данных от ком-порта. Может ли такое быть?
А если пройтись отладчиком и посмотреть, где данные превращаются в "неправильные"? Если они искажаются на ReadFile - тогда проблема имхо в драйвере устройства, если где-то в другом месте - то там и надо искать ошибку. Ну и кроме того, хорошо бы проверить значение RealRead после чтения данных...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
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.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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