| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Приложени повисает при ожидании слов от com-порта |
| Автор: BBulat 9.9.2008, 11:30 | ||
| Здравствуйте! У меня USB-девайс реализует виртуальный COM-порт. С помощью приложения я открываю драйвер моего девайса как COM-порт, произвожу туда запись. Если в девайс отвечает сразу, то приложение производит считывание данных от девайса, но если девайс отвечает с определенной задержкой, то приложение повисает.
Приложение повисает на строчке while(AvaibleBytes<2){AvaibleBytes = comstat.cbInQue;}. Почему так происходит? |
| Автор: deniska 9.9.2008, 11:49 |
| почему? ну наверно потому что AvaibleBytes получается всегда меньше двух.... условие изменить зщначит надо |
| Автор: BBulat 9.9.2008, 12:00 |
| Дело в том, что если в прошивке девайса я убираю задержку на несколько секунд при ответе приложению, то приложение не повисает. Но как я ввожу задержку (а реально может быть задержка хоть несколько минут), то приложение повисает именно на этом месте. |
| Автор: deniska 9.9.2008, 12:13 |
| значит в случае задержки в comstat.cbInQue возвращается числ меньшее 2 выходит мертвый цикл. во-первых поменять условие(может алгоритм), а во-вторых вынести работу с портом в отдельный поток чтоб GUI не повисал |
| Автор: ama_kid 9.9.2008, 12:16 |
| BBulat, у тебя в цикле не происходит обновления значения comstat.cbInQue (а должно)... И вообще, по-хорошему чтение данных из девайса надо вынести в отдельный поток, чтобы не вешать приложение... |
| Автор: BBulat 9.9.2008, 12:23 |
| Дело в том, что мое приложение больше ничего не делает, а только ждет ответа от девайса, поэтому в потоке оно точно также ждет. А как обновлять значение comstat.cbInQue? |
| Автор: ama_kid 9.9.2008, 12:29 | ||
| в потоке будет ждать только поток, но не весь процесс. Ну, например, так же, как ты делаешь это несколькими строчками выше:
|
| Автор: BBulat 9.9.2008, 12:38 | ||
я так сделал, не помогает:
Также виснет. |
| Автор: ama_kid 9.9.2008, 13:12 |
| во-первых, вставь хотя бы sleep(100); в конец цикла, а во вторых, виснет до получения информации из девайса или навсегда? Если первое - тогда это будет в любом случае до тех пор, пока ты не вынесешь чтение данных из девайса в отдельный поток. Если второе - тогда надо смотреть весь код целиком, видимо есть какое-то влияние остальной части приложения (хотя не похоже)... |
| Автор: BBulat 9.9.2008, 13:37 |
| спасибо) теперь не виснет даже без sleep()! Правда ща данные возвращает не те, но буду разбираться))) Спасибо! |
| Автор: BBulat 10.9.2008, 12:06 | ||
| Извиняюсь, что еще раз поднимаю тему, но возникла очередная проблема) Приложение теперь не повисает, и как только от ком-порта приходит ответ, приложение выводит на экран данные, но эти данные всегда одинаковы, независимо от того, что передает СОМ-порт. Дело в том, что мое устройство, имитирующее виртуальный ком-порт, считывает данные с некоторой шины, а потом передает их по усб-порту на комп. Так вот, если на этой некоторой шине сначала появятся данные, а потом устройство считает их и передаст компу, то мое приложение выводит именно то, что появилось на шине. Но, если я сначала запущу свое устройство в режим сканирования шины и соответственно мое приложение будет ожидать ответ от устройства, то когда появляются данные на шине, приложение уже выводит совсем другие числа (всегда одно и тоже). В прошивке устройства, на мой взгляд ошибок нет, есть подозрения, что данные теряются, когда приложение выходит из ожидания данных от ком-порта. Может ли такое быть? Код приложения, связанный с ожиданием данных от ком-порта:
|
| Автор: ama_kid 10.9.2008, 12:45 |
| А если пройтись отладчиком и посмотреть, где данные превращаются в "неправильные"? Если они искажаются на ReadFile - тогда проблема имхо в драйвере устройства, если где-то в другом месте - то там и надо искать ошибку. Ну и кроме того, хорошо бы проверить значение RealRead после чтения данных... |