![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Здравствуйте!
У меня USB-девайс реализует виртуальный COM-порт. С помощью приложения я открываю драйвер моего девайса как COM-порт, произвожу туда запись. Если в девайс отвечает сразу, то приложение производит считывание данных от девайса, но если девайс отвечает с определенной задержкой, то приложение повисает.
Приложение повисает на строчке while(AvaibleBytes<2){AvaibleBytes = comstat.cbInQue;}. Почему так происходит? |
|||
|
||||
| deniska |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
почему? ну наверно потому что AvaibleBytes получается всегда меньше двух....
условие изменить зщначит надо |
|||
|
||||
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Дело в том, что если в прошивке девайса я убираю задержку на несколько секунд при ответе приложению, то приложение не повисает. Но как я ввожу задержку (а реально может быть задержка хоть несколько минут), то приложение повисает именно на этом месте.
|
|||
|
||||
| deniska |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 398 Регистрация: 1.7.2005 Где: Троицк Репутация: нет Всего: 0 |
значит в случае задержки в comstat.cbInQue возвращается числ меньшее 2 выходит мертвый цикл. во-первых поменять условие(может алгоритм), а во-вторых вынести работу с портом в отдельный поток чтоб GUI не повисал
|
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
BBulat, у тебя в цикле не происходит обновления значения comstat.cbInQue (а должно)...
И вообще, по-хорошему чтение данных из девайса надо вынести в отдельный поток, чтобы не вешать приложение... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Дело в том, что мое приложение больше ничего не делает, а только ждет ответа от девайса, поэтому в потоке оно точно также ждет.
А как обновлять значение comstat.cbInQue? |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
в потоке будет ждать только поток, но не весь процесс.
Ну, например, так же, как ты делаешь это несколькими строчками выше:
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
я так сделал, не помогает:
Также виснет. |
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
во-первых, вставь хотя бы sleep(100); в конец цикла, а во вторых, виснет до получения информации из девайса или навсегда? Если первое - тогда это будет в любом случае до тех пор, пока ты не вынесешь чтение данных из девайса в отдельный поток. Если второе - тогда надо смотреть весь код целиком, видимо есть какое-то влияние остальной части приложения (хотя не похоже)...
-------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
спасибо) теперь не виснет даже без sleep()! Правда ща данные возвращает не те, но буду разбираться))) Спасибо!
|
|||
|
||||
| BBulat |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 5.12.2006 Репутация: нет Всего: нет |
Извиняюсь, что еще раз поднимаю тему, но возникла очередная проблема) Приложение теперь не повисает, и как только от ком-порта приходит ответ, приложение выводит на экран данные, но эти данные всегда одинаковы, независимо от того, что передает СОМ-порт.
Дело в том, что мое устройство, имитирующее виртуальный ком-порт, считывает данные с некоторой шины, а потом передает их по усб-порту на комп. Так вот, если на этой некоторой шине сначала появятся данные, а потом устройство считает их и передаст компу, то мое приложение выводит именно то, что появилось на шине. Но, если я сначала запущу свое устройство в режим сканирования шины и соответственно мое приложение будет ожидать ответ от устройства, то когда появляются данные на шине, приложение уже выводит совсем другие числа (всегда одно и тоже). В прошивке устройства, на мой взгляд ошибок нет, есть подозрения, что данные теряются, когда приложение выходит из ожидания данных от ком-порта. Может ли такое быть? Код приложения, связанный с ожиданием данных от ком-порта:
|
|||
|
||||
| ama_kid |
|
|||
![]() АСУТП-кодер ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1460 Регистрация: 5.3.2007 Где: Москва Репутация: 5 Всего: 95 |
А если пройтись отладчиком и посмотреть, где данные превращаются в "неправильные"? Если они искажаются на ReadFile - тогда проблема имхо в драйвере устройства, если где-то в другом месте - то там и надо искать ошибку. Ну и кроме того, хорошо бы проверить значение RealRead после чтения данных... -------------------- самурай без меча подобен самураю с мечом, но только без меча |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |