реклама на сайте
подробности

 
 
> Программирование COM под Windows, не могу справится с переполнением приемного буфера
paskal
сообщение Nov 19 2012, 16:10
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Проверяю UART некоторого устройства через компьютер. Программа написана на C++ билдере под ХР. Прием - передача в принципе работает. Компьютер посылает блок данных, устройство в ответ шлет свой блок, комп его принимает. Программа при этом работает исключительно в синхронном режиме: пошлет пакет, ожидает ответного пакета.

Но есть еще отдельный режим, когда устройство посылает поток байт, а компьютер ничего с ними не делает. После этого программа перестает работать. Выяснил что это происходит из за переполнения приемного буфера, но вылечить это не могу. Не помогает ни вызов ClearCommError, ни закрытие-открытие порта. Да и не может помочь, т.к. в пошаговой отладке выяснилось что переменная в которой хранился дескриптор порта (полученный вызовом CreateFile) - затирается. Т.е. я в принципе не могу работать с портом. Пробовал устранить переполнение присвоением false в переменной dcb->fAbortOnError - не помогло.
Что еще посоветуете?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zombi
сообщение Nov 19 2012, 18:18
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



1. Попробуйте всегда перед началом работы с портом выполнить PurgeComm.
2. Не думаю что виндовский буфер может что то затирать кроме себя. biggrin.gif Неужели Вы думаете что винда может не контролировать переполнение буфера и что то там затирать? biggrin.gif
Go to the top of the page
 
+Quote Post
paskal
сообщение Nov 19 2012, 19:08
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(zombi @ Nov 19 2012, 21:18) *
1. Попробуйте всегда перед началом работы с портом выполнить PurgeComm.

Не получится. После переполения теряется дескриптор, а он нужен в том числе и для PurgeComm.
Цитата(zombi @ Nov 19 2012, 21:18) *
2. Не думаю что виндовский буфер может что то затирать кроме себя. biggrin.gif Неужели Вы думаете что винда может не контролировать переполнение буфера и что то там затирать? biggrin.gif

Честно - совсем так не думал. Но это происходит и я не могу понять почему.


Цитата(Xenia @ Nov 19 2012, 21:20) *
Мне не понятно ваше возражение о том, что "Буфер любого размера все равно когда-то переполнится". С чего бы ему вдруг переполняться, если вы посылки регулярно забираете? Этот буфер FIFO, и переполниться он может только если посылки будут приходить, а получать вы их не будете.

Забираю я из буфера не регулярно. А ненужные посылки идут непрерывно.
Ситуация такая. Есть посылки которые шлет компьютер по нажатию мышкой, и получает тут же ответ. Это все работает. А можно переключить пульт в автономный режим. И в этом режиме в компьютер непрерывно шлется мусор. Компьютер в это время ничего не делает, но буфер его наполняется мусором. И количество мусора ничем не ограничено.

Цитата(Xenia @ Nov 19 2012, 21:20) *
На ваш вопрос я уже ответила (или попыталась ответить) советом увеличить размер буфера. Если вы знаете размер посылки, то сделайте размер приемного буфера раз в 10 больше,

Да хоть в 1000 раз, все равно он теоретически может переполниться, я уже сказал что такой вариант мне не подходит.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 19 2012, 19:10
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (paskal @ Nov 19 2012, 20:55) *
Не получится. После переполения теряется дескриптор,
Но подумайте, что вы такое пишете? Дескриптор в винде - это указатель, которая винда дает вам при открытии прота. Вы его храните у себя, как он может потеряться? Разве что ваша программа неловким движением что-то пишет в ту ячейку, куда вы положили этот указатель.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
paskal
сообщение Nov 20 2012, 15:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(Сергей Борщ @ Nov 19 2012, 22:10) *
Но подумайте, что вы такое пишете? Дескриптор в винде - это указатель, которая винда дает вам при открытии прота. Вы его храните у себя, как он может потеряться? Разве что ваша программа неловким движением что-то пишет в ту ячейку, куда вы положили этот указатель.

Ваша правда, это я накосячил. Сегодня потрассировал внимательнее. Оказалось что я очищал буфер путем определения количества байт в нем ф-ей ClearCommError, потом читал всю эту длину одним махом в свой буфер. А когда мусора было слишком много, больше моего буфера, то соответственно терлись соседние данные. Вылечил заменой на PurgeComm.
Всем спасибо, ваши советы подтолкнули где искать ошибку.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- paskal   Программирование COM под Windows   Nov 19 2012, 16:10
- - Xenia   Посоветую увеличить размер буфера (можно входного ...   Nov 19 2012, 16:17
|- - paskal   Цитата(Xenia @ Nov 19 2012, 19:17) Посове...   Nov 19 2012, 16:42
|- - Xenia   Цитата(paskal @ Nov 19 2012, 20:42) Нет, ...   Nov 19 2012, 16:52
- - paskal   Таймер там не нужен потому что алгоритм работы пре...   Nov 19 2012, 17:16
|- - Xenia   Цитата(paskal @ Nov 19 2012, 21:16) Можно...   Nov 19 2012, 18:20
|- - zombi   Цитата(Xenia @ Nov 19 2012, 22:20) ... Эт...   Nov 19 2012, 18:50
||- - zombi   Цитата(paskal @ Nov 19 2012, 21:55) После...   Nov 19 2012, 19:09
||- - paskal   Цитата(Сергей Борщ @ Nov 19 2012, 22:10) ...   Nov 19 2012, 19:39
|||- - XVR   Цитата(paskal @ Nov 19 2012, 23:39) Ну а ...   Nov 20 2012, 08:50
||- - paskal   дубль. сорри.   Nov 19 2012, 19:42
|- - MrYuran   Цитата(zombi @ Nov 19 2012, 22:18) 2. Не ...   Nov 20 2012, 09:39
- - dac   ТС походу объявил в проге массив, и считывает в не...   Nov 20 2012, 10:36
- - ARV   я конечно извиняюсь... но нафига вообще открывать ...   Nov 20 2012, 11:19
|- - Xenia   Цитата(ARV @ Nov 20 2012, 15:19) я конечн...   Nov 20 2012, 12:20
|- - ARV   Цитата(Xenia @ Nov 20 2012, 16:20) А вот ...   Nov 20 2012, 12:32
|- - vvs157   Цитата(ARV @ Nov 20 2012, 16:32) что може...   Nov 20 2012, 13:08
|- - Xenia   Цитата(ARV @ Nov 20 2012, 16:32) Xenia, б...   Nov 20 2012, 14:52
- - vvs157   Цитата(paskal @ Nov 19 2012, 20:10) что п...   Nov 20 2012, 11:23
- - zombi   Цитата(MrYuran @ Nov 20 2012, 12:39) Откр...   Nov 20 2012, 11:53


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 09:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01444 секунд с 7
ELECTRONIX ©2004-2016