| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Работа с непрерывным потоком данных |
| Автор: RinOSpro 27.1.2009, 10:46 |
| Здравствуйте! Есть COM порт, с него нужно принимать данные и обрабатывать Сейчас работаю через API CreateFile, ReadFile, WriteFile. С COM порта идет непрерывный поток данных, мне нужно его обрабатывать и еще успевать выводить на экран результаты. Все работает, но иногда данные теряются. К примеру должно быть, и что пришло: 5149 6159 7139 7149C0B83109319931 A9 3129311931A9311931899 5149 6159 71A9 3129311931A9311931899 потерялись Как быть что делать даже если самая базовая операция ReadFile, глючит... |
| Автор: Virtuals 27.1.2009, 11:09 |
| RinOSpro, код показывай, так небывает. |
| Автор: Alexeis 27.1.2009, 11:49 |
| Может и бывает если внутренний буфер переполняется. Обычно чтение из COM порта делают в отдельном потоке. Есть и куча примеров и готовых компонентов. |
| Автор: RinOSpro 27.1.2009, 11:59 |
| Подскажите нормальный примерчик, асинхронной записи/чтения. И может есть какая книжка толковая, а то в статьях информация кусками... |
| Автор: Alexeis 27.1.2009, 12:47 | ||||||||
| Я вот использовал у себя TiaRS232 (см. атач) Там примерно такой алгоритм. Создаем и назначаем обработчик
настариваем
Завершаем
сам обработчик пришедших данных
|
| Автор: Felan 27.1.2009, 13:05 |
| ААААААААА, Собственно как автор сего творения хочу заявить, что не есть асинхронный режим. Это всего лишь указание слушающему потоку, выполнять получение данных напрямую, или использую метод Synchronize, класса Thread. Кстати, раз пошла такая пьянка, то вот чуть подправленный вариант. Тот старый глючил в многопоточном окружении при уничтожении объекта. |
| Автор: Alexeis 27.1.2009, 13:13 |
Т.е. режим всегда асинхронный? |
| Автор: Felan 27.1.2009, 14:13 |
| Ну в строгом смысле там вообще нет асинхронного режима. Он эмулируется постоянным чтением данных из вторичного потока. Если данные есть, то происходит событие. Т.е. это событие вызывается из отдельного потока, то для работы в нем надо либо не использовать VCL, либо ставить этот флаг с тру, что бы он работал через Synchronize. А так да... можно сказать, что всегда асинхронный. Но можно и не запускать прослушку, можно самому читать (Receive). Тогда уже будет самый натуральный синхронный |
| Автор: Romikgy 27.1.2009, 14:39 |
| есть асинхроный и без потоков, на событиях винды |
| Автор: Alexeis 27.1.2009, 14:42 |
| А на счет внутренней буферизации кто-то что-то знает? Какой объем внутреннего буфера у винда, чтобы как-то оценить сколько времени можно не читать данные по COM порту. |
| Автор: Romikgy 27.1.2009, 15:24 |
| SetupComm для установки буферов ( низкоуровневый фифо до 16 байт в обе стороны |
| Автор: Alexeis 27.1.2009, 15:42 |
Ну это совсем мало, у винды свой наверное куда по больше. |
| Автор: Virtuals 28.1.2009, 12:40 | ||||||
Felan,
хош скажу? на всех виндах начиная от нт4 и до ХРsp3 если в порт идут данные непрерывным потоком, а ни одно приложение их не забирает, то !: переполняется какойто там буфер, у драйвера порта сносит крышу, и все!!! порт неработает до перезагрузки виндов. ЗЫ проверено лично и не раз. Alexeis,
для меня так наоборот совсем много, всегда отрубаю фифо, иначе фиг угадаеш когда посылка данных прекращается,... что ручками подергать ну там dtr. пользую, компонент для портов (асинхроный с потоками, на событиях винды), и все ... раз пошла такая пьянка вот...где спер незнаю, но вроде чет про автора есть... так пользуем
|
| Автор: RinOSpro 28.1.2009, 14:01 | ||||
| Я думаю моя проблема от того что мало себе представляю как физически устроен COM порт, и как работает. Открываю порт:
Читаю из порта вот так:
Пишу примерно так же... Вот сомнение возникло, а может ли запись в порт как то что то сбивать? Особенно если всегда идет сплошной поток данных. |
| Автор: Felan 28.1.2009, 18:23 | ||||
Возможно... хотя и странно как-то... А сколько надо ждать? Интересно как-нибудь попробовать... как появится что-нибудь, что будет в порт писать...
Ну вроде нормально все... Сравним с моим исходником. Он в неизменном виде используется уже 3 года. Может там и не все красиво и "круто", но надежно А что она может сбивать? Ни идет они и идет... че такого? |
| Автор: RinOSpro 3.2.2009, 13:22 |
| Блин... дело было в железе... Ненавижу.... |
| Автор: Robus 16.2.2009, 20:15 | ||
Я думаю, что если ты сделаешь вот так:
То, твоя проблема исчезнет ... В твоём примере стоят "1", а это как минимум два такта UART'а ... Поэтому со временем ты вычитываешь медленее чем буфер заполняется, и в какой-то момент теряешь данные !!! Лучше всего поставить "0", это будет минимальная задержка. Так же я у тебя заметил скорость 115200х2 !!! Круто берёшь !!! А позволяет ли твой UART такое ??? Просто проверь ... 2 мегагерца это круто для RS-232 !!! И ещё ... Я заметил, что после получания пачки данных ты улетаешь на обработку это пачки !!! А тем временем новой пачке всего 512 байт отдано ... Винда, конечно, калечаня, поскольку застваляет извращаться, но я бы на твоём месте перебросил бы это всё ещё в один мега буффер, эдак на 65536 байт, и отпустил бы поток. а уже в ещё одном потоке обрабатывал бы последний буфер. |