| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Com Port |
| Автор: YuriyFrolov 27.3.2006, 14:27 | ||||
У меня такой вопрос: мне нужно считывать и отправлять данные по com порту. Механизм простой программа должна общаться с прибором который на каждое её сообщение отвечает своим сообщением. Сам прибор произвольно сообщения не отсылает. Но отвечать он может и не сразу. При отладке программа работает правильно. Но когда её запустить то появляется следующая ошибка:
Куски кода:
В чём тут проблема? |
| Автор: DeadSoul 27.3.2006, 21:27 |
| YuriyFrolov, SetCommTimeout делал? |
| Автор: Nuzur 28.3.2006, 10:00 | ||
| а не проще ли так? и так точно работает, порверялось и не раз.
И никаких гвоздей. Включаете таймер на тайм аут и по срабатыванию таймера если не получили данных или данны не корректны остонавливаете поток и отсылаете прибору либо сообщение о повторной пересылке данных, либо о том что они уже как-то и не нужны. Удачи. ЗЫ Знакомая фамилия, вы откуда? |
| Автор: takedo 28.3.2006, 10:11 |
| YuriyFrolov, А как вы определяете что данные не получены? Если по размеру входного буфера, то это знатный косячок, при котором изменение размера буфера никак не синхронизировано Windows с событием о приходе символа в порт! Я эту тему поднимал, но понимания не нашел. Однако, замечу, что такая проблема возникает, когда данные считываются кусками, то есть, когда в буфер пришло, например 5 байт из 505, мы тут же начинаем считывать пять байт и т.д. Если дожидаться конца кадра, смотреть размер входного буфера(очереди) с считывать это количество байт за один раз, проблема вроде бы отсутствует. Мое мнение - на большей скорости работы порта, например ГИГАБИТ(понятно, что этого пока нет), и этот вариант не прокатит. Есть трипути решения 1) описанный предложением выше, 2) писать свою очередь и ждать своего события, 3) переходить на синхронную передачу, тут и SetCommTimeout в тему будет. |
| Автор: YuriyFrolov 28.3.2006, 10:23 |
| А я из Киева |
| Автор: Nuzur 28.3.2006, 10:55 | ||
Зачем по размеру буфера? А CEvent вам зачем? Получили байты 1-е знач появилась надежда что весь кадр(поток или как там ИСче назвать?) прийдет правельный... соответственно отложили "убитие" таймера на Н-е количество времени.... тоесть увеличели таймаут операции..... Ну ето уже все зависит от ОУ. А Организация ваша как дразниться, напишите в личку. |