![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| RinOSpro |
|
|||
|
Unregistered |
Здравствуйте! Есть COM порт, с него нужно принимать данные и обрабатывать
Сейчас работаю через API CreateFile, ReadFile, WriteFile. С COM порта идет непрерывный поток данных, мне нужно его обрабатывать и еще успевать выводить на экран результаты. Все работает, но иногда данные теряются. К примеру должно быть, и что пришло: 5149 6159 7139 7149C0B83109319931 A9 3129311931A9311931899 5149 6159 71A9 3129311931A9311931899 потерялись Как быть что делать даже если самая базовая операция ReadFile, глючит... |
|||
|
||||
| Virtuals |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 4 Всего: 11 |
RinOSpro,
код показывай, так небывает. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Может и бывает если внутренний буфер переполняется. Обычно чтение из COM порта делают в отдельном потоке. Есть и куча примеров и готовых компонентов.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| RinOSpro |
|
|||
|
Unregistered |
Подскажите нормальный примерчик, асинхронной записи/чтения.
И может есть какая книжка толковая, а то в статьях информация кусками... |
|||
|
||||
| Alexeis |
|
||||||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Я вот использовал у себя TiaRS232 (см. атач)
Там примерно такой алгоритм. Создаем и назначаем обработчик
настариваем
Завершаем
сам обработчик пришедших данных
Присоединённый файл ( Кол-во скачиваний: 35 )
COM.zip 7,79 Kb-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||
|
|||||||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
ААААААААА,
Собственно как автор сего творения хочу заявить, что не есть асинхронный режим. Это всего лишь указание слушающему потоку, выполнять получение данных напрямую, или использую метод Synchronize, класса Thread. Кстати, раз пошла такая пьянка, то вот чуть подправленный вариант. Тот старый глючил в многопоточном окружении при уничтожении объекта. Присоединённый файл ( Кол-во скачиваний: 34 )
iaRS232.zip 7,97 Kb-------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Ну в строгом смысле там вообще нет асинхронного режима. Он эмулируется постоянным чтением данных из вторичного потока. Если данные есть, то происходит событие.
Т.е. это событие вызывается из отдельного потока, то для работы в нем надо либо не использовать VCL, либо ставить этот флаг с тру, что бы он работал через Synchronize. А так да... можно сказать, что всегда асинхронный. Но можно и не запускать прослушку, можно самому читать (Receive). Тогда уже будет самый натуральный синхронный -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
есть асинхроный и без потоков, на событиях винды
-------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
А на счет внутренней буферизации кто-то что-то знает? Какой объем внутреннего буфера у винда, чтобы как-то оценить сколько времени можно не читать данные по COM порту.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 13 Всего: 146 |
SetupComm для установки буферов (
низкоуровневый фифо до 16 байт в обе стороны -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 16 Всего: 459 |
Ну это совсем мало, у винды свой наверное куда по больше. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Она устанавливает рекомендованные значения. Т.е. винда их может и не использовать. Если туда че-то не лезет, она будет автоматически его расширять. Какой свой? Не думаю, что там есть какой-то свой. Это все тот же. Вот до каких приделов он может расти... вот это вопрос Мне кажется, это ограничено только адресным пространством. Интересно, что будет потом? ЗЫЖ На моей практике ни разу не переполнялся и ни разу данные не терялись (ну с учетом того, что передача была правильная, и в проводах ничего не потерялось). Добавлено через 1 минуту и 14 секунд А можно его в мыло? Интересуют исходники, а то я как-то пытался сделать асинхронное чтение, но у меня оно глючно получилось. -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| Virtuals |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 476 Регистрация: 27.11.2006 Репутация: 4 Всего: 11 |
Felan,
хош скажу? на всех виндах начиная от нт4 и до ХРsp3 если в порт идут данные непрерывным потоком, а ни одно приложение их не забирает, то !: переполняется какойто там буфер, у драйвера порта сносит крышу, и все!!! порт неработает до перезагрузки виндов. ЗЫ проверено лично и не раз. Alexeis,
для меня так наоборот совсем много, всегда отрубаю фифо, иначе фиг угадаеш когда посылка данных прекращается,... что ручками подергать ну там dtr. пользую, компонент для портов (асинхроный с потоками, на событиях винды), и все ... раз пошла такая пьянка вот...где спер незнаю, но вроде чет про автора есть... так пользуем
Это сообщение отредактировал(а) Virtuals - 28.1.2009, 13:05 Присоединённый файл ( Кол-во скачиваний: 29 )
Comm32.rar 9,33 Kb |
||||||
|
|||||||
| RinOSpro |
|
||||
|
Unregistered |
Я думаю моя проблема от того что мало себе представляю как физически устроен COM порт, и как работает.
Открываю порт:
Читаю из порта вот так:
Пишу примерно так же... Вот сомнение возникло, а может ли запись в порт как то что то сбивать? Особенно если всегда идет сплошной поток данных. |
||||
|
|||||
| Felan |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 284 Регистрация: 2.8.2007 Где: Самара Репутация: 2 Всего: 7 |
Возможно... хотя и странно как-то... А сколько надо ждать? Интересно как-нибудь попробовать... как появится что-нибудь, что будет в порт писать...
Ну вроде нормально все... Сравним с моим исходником. Он в неизменном виде используется уже 3 года. Может там и не все красиво и "круто", но надежно А что она может сбивать? Ни идет они и идет... че такого? -------------------- // Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного. |
|||
|
||||
| RinOSpro |
|
|||
|
Unregistered |
Блин... дело было в железе... Ненавижу....
|
|||
|
||||
| Robus |
|
|||
|
Entire Профиль Группа: Участник Сообщений: 32 Регистрация: 15.12.2005 Репутация: нет Всего: 1 |
Я думаю, что если ты сделаешь вот так:
То, твоя проблема исчезнет ... В твоём примере стоят "1", а это как минимум два такта UART'а ... Поэтому со временем ты вычитываешь медленее чем буфер заполняется, и в какой-то момент теряешь данные !!! Лучше всего поставить "0", это будет минимальная задержка. Так же я у тебя заметил скорость 115200х2 !!! Круто берёшь !!! А позволяет ли твой UART такое ??? Просто проверь ... 2 мегагерца это круто для RS-232 !!! И ещё ... Я заметил, что после получания пачки данных ты улетаешь на обработку это пачки !!! А тем временем новой пачке всего 512 байт отдано ... Винда, конечно, калечаня, поскольку застваляет извращаться, но я бы на твоём месте перебросил бы это всё ещё в один мега буффер, эдак на 65536 байт, и отпустил бы поток. а уже в ещё одном потоке обрабатывал бы последний буфер. |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |