Страница 1 из 1

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

Добавлено: Пн ноя 19, 2012 19:44:33
paskal
Добрый вечер!
Сваял программку на Билдере для работы с COM портом. Программа простенькая, использую открытие порта через CreateFile, запись/чтение через WriteFile/ReadFile. Режим работы синхронный: программа послала блок, ждет ответный блок с заранее известным числом байт. Это у меня работает.
А проблема связана с тем что устройство иногда передает большой поток данных. Программа с ними не должна ничего делать, просто игнорировать. Но они все равно поступают в приемный буфер и переполняют его. Да так что клинит всю дальнейшую работу. Хуже всего что затирается переменная в которой записан дескриптор порта, а без дескриптора я ничего не могу сделать. Ни сбросить буфер, ни закрыть порт. В общем надо как то предотвратить переполнение буфера. Какие есть варианты для этого?

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

Добавлено: Пн ноя 19, 2012 23:11:36
Мурик
paskal писал(а): Хуже всего что затирается переменная в которой записан дескриптор порта
Как это? :shock:
Видимо вы не правильно построили программу. Буфер у вас где находится?
И функция ReadFile читает столько байт, сколько запросили, а не сколько пришло. Видимо у вас есть проблемы в коде. :idea:

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

Добавлено: Вт ноя 20, 2012 12:54:27
menzoda
Код работы с портом в студию.

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

Добавлено: Вс ноя 25, 2012 06:19:10
Z_h_e
paskal писал(а):В общем надо как то предотвратить переполнение буфера
Для этого надо своевременно читать данные буфера, или чаще читайте или увеличьте объем буфера.

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

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