Переполнение буфера COM порта

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 160
Зарегистрирован: Пн сен 05, 2011 10:03:06
Откуда: Тула

Сообщение paskal »

Добрый вечер!
Сваял программку на Билдере для работы с COM портом. Программа простенькая, использую открытие порта через CreateFile, запись/чтение через WriteFile/ReadFile. Режим работы синхронный: программа послала блок, ждет ответный блок с заранее известным числом байт. Это у меня работает.
А проблема связана с тем что устройство иногда передает большой поток данных. Программа с ними не должна ничего делать, просто игнорировать. Но они все равно поступают в приемный буфер и переполняют его. Да так что клинит всю дальнейшую работу. Хуже всего что затирается переменная в которой записан дескриптор порта, а без дескриптора я ничего не могу сделать. Ни сбросить буфер, ни закрыть порт. В общем надо как то предотвратить переполнение буфера. Какие есть варианты для этого?
Если бы на станции "Мир" стояли Винды, она бы еще висела и висела...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

paskal писал(а): Хуже всего что затирается переменная в которой записан дескриптор порта
Как это? :shock:
Видимо вы не правильно построили программу. Буфер у вас где находится?
И функция ReadFile читает столько байт, сколько запросили, а не сколько пришло. Видимо у вас есть проблемы в коде. :idea:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 535
Зарегистрирован: Вт авг 28, 2012 22:21:33

Сообщение menzoda »

Код работы с портом в студию.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

paskal писал(а):В общем надо как то предотвратить переполнение буфера
Для этого надо своевременно читать данные буфера, или чаще читайте или увеличьте объем буфера.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Какой именно буфер переполняется? у порта есть аппаратный буфер в 15 байт, иногда больше но он практически НИКОГДА не переполняется, поскольку современные чипы работают с DMA. Данные с этого буфера поступают в виндовый буфер порядка 1-2Мб, при переполнении которого просто возникает ошибка в программе... но затирать дескриптор? скорей всего у вас переполняется какой-то свой внутренний буфер реализованный средствами программы - тут поможет ТОЛЬКО проверка выхода за границы отведенной памяти - не принимать данных больше чем можно поместить в выделенную память. Причем во многих случаях такое поведение приводит к ошибке AV в программе, но бывает так что массив располагается до каких-то еще переменных в одной области памяти выделенной программе - в таких случаях операционка не может отследить выход за пределы отведенной памяти под буффер и ошибка AV не возникает, поскольку с точки зрения операционки программа что-то делает именно со своей областью памяти.
Контактная информация:
Реклама
Ответить

Вернуться в «Интеграция с ПК»