![]() |
|
|
![]()
|
|
| YuriyFrolov |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 27.3.2006 Репутация: нет Всего: нет |
У меня такой вопрос: мне нужно считывать и отправлять данные по com порту. Механизм простой программа должна общаться с прибором который на каждое её сообщение отвечает своим сообщением. Сам прибор произвольно сообщения не отсылает. Но отвечать он может и не сразу. При отладке программа работает правильно. Но когда её запустить то появляется следующая ошибка:
Куски кода:
В чём тут проблема? |
||||
|
|||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
YuriyFrolov, SetCommTimeout делал?
-------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: 3 Всего: 5 |
а не проще ли так?
и так точно работает, порверялось и не раз.
И никаких гвоздей. Включаете таймер на тайм аут и по срабатыванию таймера если не получили данных или данны не корректны остонавливаете поток и отсылаете прибору либо сообщение о повторной пересылке данных, либо о том что они уже как-то и не нужны. Удачи. ЗЫ Знакомая фамилия, вы откуда? -------------------- Never again... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
YuriyFrolov, А как вы определяете что данные не получены? Если по размеру входного буфера, то это знатный косячок, при котором изменение размера буфера никак не синхронизировано Windows с событием о приходе символа в порт! Я эту тему поднимал, но понимания не нашел. Однако, замечу, что такая проблема возникает, когда данные считываются кусками, то есть, когда в буфер пришло, например 5 байт из 505, мы тут же начинаем считывать пять байт и т.д. Если дожидаться конца кадра, смотреть размер входного буфера(очереди) с считывать это количество байт за один раз, проблема вроде бы отсутствует. Мое мнение - на большей скорости работы порта, например ГИГАБИТ(понятно, что этого пока нет), и этот вариант не прокатит. Есть трипути решения 1) описанный предложением выше, 2) писать свою очередь и ждать своего события, 3) переходить на синхронную передачу, тут и SetCommTimeout в тему будет.
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| YuriyFrolov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 27.3.2006 Репутация: нет Всего: нет |
А я из Киева
|
|||
|
||||
| Nuzur |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 4.7.2004 Репутация: 3 Всего: 5 |
Зачем по размеру буфера? А CEvent вам зачем? Получили байты 1-е знач появилась надежда что весь кадр(поток или как там ИСче назвать?) прийдет правельный... соответственно отложили "убитие" таймера на Н-е количество времени.... тоесть увеличели таймаут операции..... Ну ето уже все зависит от ОУ. А Организация ваша как дразниться, напишите в личку. -------------------- Never again... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |