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

 
 
> Windows7: прием байтов через COM-порт без потерь, Кто-то имеет личный опыт? чем побороть потерю отдельных байтов?
Ruslan1
сообщение May 22 2017, 06:27
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Здравствуйте!
Есть Windows7 Pro, 32-bit, компьютер- китайский одноплатник на Intel 1037U, 4GB RAM.
СОМ-порты- 4 штуки прямо на материнке.
И есть внешний передатчик, посылающий в COM-порт пакеты.
Скорость- 115200, стандартный формат 8N1.
Длина пакета- не более 255 байт, межпакетный интервал- не менее 4 байт, часто гораздо больше (десятки миллисекунд). Каждый пакет имеет контрольную сумму (crc16), по которой и принимается решение о валидности пакета. Общая загрузка канала где-то 5-8 килобайт в секунду, то есть до 80%. Загрузка CPU около 10-15%.

И есть самописная программа на С++Билдере (6), данный вариант делался по прерываниям, с несколькими потоками (базой был вот этот документ).
Есть поток, принимающий все байты по прерываниям и валящий в большой кольцевой буфер. И другой поток периодически выгребает байты из буфера и делит на пакеты для обработки, проверяет валидность.

Только прием, никаких переключений на передачу.
В результате приемник иногда пропускает байты. То есть все принятые байты всегда совпадают с переданными, но некоторые байты пропущены. Всегда пропущено не более одного байта за раз, в любом месте пакета. Часто бывает что пропущено по одному байту в двух следующих друг за другом пакетах.

Обычно фактов потери байта где-то 10-20 в сутки. Корреляция с действиями Виндоуса пока не найдена, очень уж все случайно.
Потери именно в компьютере- подключенный прямо к этому же разъему логический анализатор исправно ловит все байты, никакого криминала или отклонений во времянке не обнаружено (по уровню тоже все без проблем)


Вопросов два:
1. Кто-то в подобных условиях добивался абсолютно безошибочного приема потока через COM-порт в Виндоус (7) на 115200?
2. куда копать? Сильно надеюсь что моя программа виновата. На другом железе пробовал- эффект тот же, то есть это не электроника глючит.
С приоритетами игрался, никакого эффекта.

Заранее спасибо за любые советы (по существу).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AlexRayne
сообщение May 22 2017, 08:15
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(Ruslan1 @ May 22 2017, 10:27) *
Есть поток, принимающий все байты по прерываниям и валящий в большой кольцевой буфер. И другой поток периодически выгребает байты из буфера и делит на пакеты для обработки, проверяет валидность.

Вот это место непонятно - для каждого порта свой буфер, или общий на все порты? выпадание байта определяете по сбою crc?

Что Вы называете "приемом по прерыванию"?
У выни свои прекрасные дрова для КОМ, и даже целый специальный апи в ядро встроен под устройства Comm - модемы проще. все известные мне либы в борланде являются прокладкой к этому стандартному АПИ. напрямую с прерыванием никто не работает.
проблем с потерями не было, хотя обмен бывал интенсивный - мегабод.
можно посоветовать покрутить :
1)объем буфферов кома (я делал 8кб)
2)приоритет нитки приемника сделать выше нормального
3)если у вас между пакетами есть пауза более 1мс, настроить ее в свойствах таймингов кома. в запросах асинхронного чтения возможно оно поможет АПИ возвращать целиком пакет а не куски случайно презанные.
4)какая может быть гарантия что порт вашего ПК видит ваш поток без потерь, даже если ваш снифер прекрасен? Вы в качестве снифера тот же самый ПК используете?
5) можно поставить прокси с журналированием на ком (я пользовал com0project, но их вроде множество разных), и уже к нему подключать вашу программу. в этом случае вы сможете сравнить поток принятый прокси с потоком принятым вашей софтиной.
6) вы журналировали поток считанный из порта, сравнить его с финальными нарезанными пакетами? точно эти байты не считываются из порта?

Сообщение отредактировал AlexRayne - May 22 2017, 08:22
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение May 22 2017, 12:23
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



AlexRayne, большое спасибо за конструктивный ответ с кучей хороших идей!
Что именно Вы имеете в виде когда говорите про "прекрасные дрова для КОМ, и даже целый специальный апи в ядро встроен под устройства Comm"? Что именно советуете почитать-посмотреть, может даже применительно к простоте прикручивания в Билдер?
Я раньше работал по поллингу, и задачи другие были. А сейчас решил по прерываниям сделать, нашел понятное мне описание в интернете(ссылка в моем письме)- по нему и сделал.

Если уже есть компонент а или просто апишная функция "брать все байты из порта и кидать в большой пользовательский кольцевой буфер" - было бы замечательно. В пятом Билдере ставил пакет TurboPower Async Professional, но использовал по поллингу. Сейчас на новый (хихи) 6-й билдер перешел и думал без сторонних компонентов обойтись.

И это не железо, я пробовал на другом компьютере- эффект тоже имеет место быть.
И это действительно потеря в машине- прямо на порт включал независимый лог анализатор, и после сравнивал содержимое буферов его и моей программы.

Очень хочется для начала локализовать проблему, и Ваши советы мне отлично подходят- не подумал про независимый сниффер-программу прямо на этой машине. Очень надеюсь что проблема в моем коде- тогда есть большая вероятность ее решения sm.gif
Go to the top of the page
 
+Quote Post
AlexRayne
сообщение May 23 2017, 09:20
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(Ruslan1 @ May 22 2017, 16:23) *
AlexRayne, большое спасибо за конструктивный ответ с кучей хороших идей!
Что именно Вы имеете в виде когда говорите про "прекрасные дрова для КОМ, и даже целый специальный апи в ядро встроен под устройства Comm"? Что именно советуете почитать-посмотреть, может даже применительно к простоте прикручивания в Билдер?

Вот это именно и имел ввиду - что вы путаете всех использованием слова "драйвер". В венде уже написаны дрова под множество материнок и уж тем более под известные стандартные контроллеры УАРТ. Вот они как раз напрямую с железом и прерыванием работают. писать их не требуется - они готовы и встроены в Ось. Овь прелагает довольно простое стандартное АПИ для работы с Сомм портами. Если вы поставили борланд - покурите их хелпы Win32 SDK или чтото вроде этого. Это огромный хелп по всем ресурсам венды. и в частности там описан и Comm интерфейс. Если вы полезете в изходники АсинкПро - то наглядно увидите как вендовые вызовы используются. АсинкПро - это обертка вендовых вызовов.
Когда я говорю "прекрасные" - значит они есть работают, отлажены, и проверены. (и удобны)

Цитата(Ruslan1 @ May 22 2017, 16:23) *
AlexRayne, большое спасибо за конструктивный ответ с кучей хороших идей!

Если уже есть компонент а или просто апишная функция "брать все байты из порта и кидать в большой пользовательский кольцевой буфер" - было бы замечательно. В пятом Билдере ставил пакет TurboPower Async Professional, но использовал по поллингу. Сейчас на новый (хихи) 6-й билдер перешел и думал без сторонних компонентов обойтись.

Большой буфер уже предоставляет Сомм интерфейс, размер его можно настраивать, по моей памяти он по умолчанию 4кБ делается. собственно из него и читается данные порта обычными файловыми чтениями.
По моему опыту - оказалось проще работать без оболочек, напрямую. это не требует стороннего кода и возни со сторонними пакетами.
требует освоения навыка работы с асинхронными вызовами венды чтения\записи файла - там их называют почемуто overlaped

Цитата(Ruslan1 @ May 22 2017, 16:23) *
AlexRayne, большое спасибо за конструктивный ответ с кучей хороших идей!
И это не железо, я пробовал на другом компьютере- эффект тоже имеет место быть.
И это действительно потеря в машине- прямо на порт включал независимый лог анализатор, и после сравнивал содержимое буферов его и моей программы.

но чтобы окончательно убедиться снифьте ваш траффик на этой же самой машине, либо через прокси, либо тупо на другой порт палралельно сигнал заведите и с него все в журнал.

Вам уже посоветовали использовать 1,5-2 стопбита. это хорошее предложение, если оно конечно возможно для ваших абонентов.

С адаптерами КОМ-УСБ советую не играться если есть нормальный порт на матери или PCI плате ввода вывода. Я встретил кривой адаптер от МОХи, народ жаловался на ФТДИ - у обоих проблемы с буфером приемника на больших трафиках.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Ruslan1   Windows7: прием байтов через COM-порт без потерь   May 22 2017, 06:27
||- - Ruslan1   Цитата(AlexRayne @ May 23 2017, 12:20) Во...   May 23 2017, 11:17
||- - AlexRayne   Цитата(Ruslan1 @ May 23 2017, 15:17) Хм. ...   May 23 2017, 15:09
||- - Ruslan1   Большое спасибо всем за кучу отличных идей и совет...   May 23 2017, 17:13
||- - AlexRayne   Цитата(Ruslan1 @ May 23 2017, 20:13) дада...   May 23 2017, 20:00
||- - AHTOXA   Добавлю в копилку способов передачи данных от пото...   May 24 2017, 07:07
|- - Lagman   Цитата(AlexRayne @ May 22 2017, 11:15) Чт...   May 22 2017, 12:59
- - neiver   Начинать надо с того, что COM порт вообще и его ре...   May 22 2017, 08:25
|- - AlexRayne   Цитата(neiver @ May 22 2017, 12:25) Начин...   May 22 2017, 08:37
|- - sonycman   Цитата(neiver @ May 22 2017, 12:25) Начин...   May 22 2017, 13:48
||- - jcxz   Цитата(sonycman @ May 22 2017, 15:48) Тож...   May 25 2017, 22:14
||- - AHTOXA   Цитата(jcxz @ May 26 2017, 03:14) Хмм... ...   May 26 2017, 07:05
||- - jcxz   Цитата(AHTOXA @ May 26 2017, 09:05) Да, г...   May 26 2017, 10:14
||- - AHTOXA   Цитата(jcxz @ May 26 2017, 15:14) Читать ...   May 26 2017, 11:23
||- - jcxz   Цитата(AHTOXA @ May 26 2017, 13:23) Если ...   May 26 2017, 12:38
||- - V_G   Цитата(jcxz @ May 26 2017, 22:38) Мне его...   May 26 2017, 13:42
|||- - jcxz   Цитата(V_G @ May 26 2017, 15:42) А вот фу...   May 26 2017, 16:13
|||- - XVR   Цитата(jcxz @ May 26 2017, 19:13) Я вот н...   May 26 2017, 19:11
||||- - AlexRayne   ЦитатаЯ вот не пойму - а в чём плюс-то такого разд...   May 26 2017, 20:19
|||- - V_G   Цитата(jcxz @ May 27 2017, 02:13) Вот зде...   May 26 2017, 22:47
|||- - jcxz   Цитата(V_G @ May 27 2017, 00:47) Речь вед...   May 29 2017, 08:12
||- - XVR   Цитата(jcxz @ May 26 2017, 15:38) Затем, ...   May 26 2017, 14:15
||- - AHTOXA   Цитата(jcxz @ May 26 2017, 17:38) А если ...   May 27 2017, 00:28
|- - XVR   Цитата(neiver @ May 22 2017, 11:25) У ста...   May 23 2017, 11:20
|- - Ruslan1   Цитата(XVR @ May 23 2017, 13:20) Чтение э...   May 23 2017, 12:42
|- - V_G   Цитата(Ruslan1 @ May 23 2017, 22:42) Я то...   May 23 2017, 13:33
- - rx3apf   1. Дурацкий вопрос - а порты вообще с FIFO ? И оно...   May 22 2017, 15:55
- - Raven   Если Wind'а иногда не успевает выгребать данны...   May 22 2017, 16:10
- - DS   В 7 похоже, есть баг в COM драйвере. Многие програ...   May 22 2017, 19:49
- - ViKo   Я пересылал в комп пакеты данных на скорости 11520...   May 23 2017, 05:09
|- - V_G   Цитата(ViKo @ May 23 2017, 15:09) Я перес...   May 23 2017, 05:39
|- - Ruslan1   Цитата(ViKo @ May 23 2017, 08:09) Я перес...   May 23 2017, 10:48
- - ViKo   Возможно, фантазирую, детально не вникал, полагаю,...   May 23 2017, 07:09
|- - @Ark   Вероятная причина, все-таки, несовпадение тактовых...   May 23 2017, 11:04
|- - krux   Цитата(@Ark @ May 23 2017, 14:04) Вероятн...   May 23 2017, 12:51
|- - @Ark   Цитата(krux @ May 23 2017, 15:51) считаю,...   May 23 2017, 13:15
- - V_G   Кстати, о больших трафиках. Так ли они необходимы?...   May 23 2017, 09:30
- - ViKo   Я не сутками пересылал, а кадрами. По ним - обрабо...   May 23 2017, 10:52
- - ViKo   Посмотрел, сколько стопов использую, оказалось, 1....   May 23 2017, 11:31
|- - Ruslan1   Цитата(ViKo @ May 23 2017, 13:31) Посмотр...   May 23 2017, 12:51
- - XVR   Вызов Synchronize(RxDataProcessing); из нити чтени...   May 23 2017, 14:06
- - XVR   Через Synchronize можно, но в нем должно выполнять...   May 23 2017, 17:58
- - AlexandrY   Цитата(Ruslan1 @ May 22 2017, 09:27) Здра...   May 24 2017, 07:35
|- - Ruslan1   Цитата(AlexandrY @ May 24 2017, 09:35) На...   May 24 2017, 12:53
|- - AlexRayne   Цитата(Ruslan1 @ May 24 2017, 16:53) Спаи...   May 24 2017, 12:55
- - AlexRayne   Напишите хоть в чем выявился источник потерь   May 24 2017, 12:52
|- - Ruslan1   Цитата(AlexRayne @ May 24 2017, 14:52) На...   May 24 2017, 12:55
|- - Timmy   В коде меня удивляет использование overlapped Wait...   May 25 2017, 10:49
- - XVR   WaitForSingleObject вызывать можно. Если WaitCommE...   May 25 2017, 11:14
|- - V_G   Цитата(XVR @ May 25 2017, 21:14) WaitForS...   May 25 2017, 22:37
- - rudy_b   Тут есть стандартная проблема - после приема прише...   May 26 2017, 10:19
|- - jcxz   Цитата(rudy_b @ May 26 2017, 12:19) Вероя...   May 26 2017, 10:33
||- - XVR   Цитата(jcxz @ May 26 2017, 13:33) Принима...   May 26 2017, 11:33
|- - V_G   Цитата(rudy_b @ May 26 2017, 20:19) Тут е...   May 26 2017, 11:59
- - Ruslan1   Поздравляю всех с началом новой рабочей недели...   May 29 2017, 10:57
- - XVR   Ваш снифер умеет показывать ошибки от COM порта? Е...   May 29 2017, 11:07
|- - V_G   Цитата(XVR @ May 29 2017, 21:07) Ну и уро...   May 29 2017, 11:31
|- - XVR   Цитата(V_G @ May 29 2017, 14:31) Стандарт...   May 29 2017, 11:58
|- - Ruslan1   Цитата(XVR @ May 29 2017, 13:58) Ключевое...   May 29 2017, 12:24
|- - @Ark   Цитата(Ruslan1 @ May 29 2017, 15:24) Ребя...   May 29 2017, 12:39
||- - Ruslan1   Цитата(@Ark @ May 29 2017, 14:39) Вы ниче...   May 29 2017, 12:53
||- - @Ark   Цитата(Ruslan1 @ May 29 2017, 15:53) Там ...   May 29 2017, 13:02
||- - AlexRayne   Цитата(Ruslan1 @ May 29 2017, 16:53) поте...   May 29 2017, 14:32
||- - Ruslan1   Цитата(AlexRayne @ May 29 2017, 16:32) Вы...   May 29 2017, 16:20
||- - @Ark   Цитата(Ruslan1 @ May 29 2017, 19:20) Мы ...   May 29 2017, 17:15
|||- - Ruslan1   Цитата(@Ark @ May 29 2017, 19:15) Мы дожд...   May 29 2017, 19:00
|||- - @Ark   Цитата(Ruslan1 @ May 29 2017, 22:00) тип ...   May 29 2017, 20:06
|||- - Ruslan1   Цитата(@Ark @ May 29 2017, 22:06) Я так п...   May 29 2017, 20:34
||- - AlexRayne   Цитата(Ruslan1 @ May 29 2017, 20:20) Это ...   May 29 2017, 17:59
|- - jcxz   Цитата(Ruslan1 @ May 29 2017, 14:24) Если...   May 30 2017, 08:50
|- - XVR   Цитата(Ruslan1 @ May 29 2017, 15:24) Наде...   May 30 2017, 10:15
|- - @Ark   Цитата(XVR @ May 30 2017, 13:15) О! У...   May 30 2017, 10:23
|- - krux   Цитата(@Ark @ May 30 2017, 13:23) ТС гово...   May 30 2017, 17:28
|- - Ruslan1   Цитата(krux @ May 30 2017, 19:28) Давайте...   May 30 2017, 20:18
|- - @Ark   Цитата(Ruslan1 @ May 30 2017, 23:18) Upd:...   May 30 2017, 21:05
|- - XVR   Цитата(Ruslan1 @ May 30 2017, 23:18) Проб...   May 31 2017, 07:06
|- - Ruslan1   Цитата(XVR @ May 31 2017, 09:06) Вы в это...   May 31 2017, 07:28
|- - XVR   Цитата(Ruslan1 @ May 31 2017, 10:28) Слыш...   May 31 2017, 11:38
- - ViKo   Может, на большей скорости попробовать?   May 29 2017, 19:16
- - rx3apf   Я бы в такой ситуации попробовал такой вариант (ну...   May 31 2017, 08:43
- - rx3apf   Ну при чем тут скорость и уровни ? Скорость не сов...   Jun 1 2017, 10:00
|- - XVR   Цитата(rx3apf @ Jun 1 2017, 13:00) Ну при...   Jun 1 2017, 11:25
- - rx3apf   Ошибка кадра должна все ж обрабатываться и как-то ...   Jun 1 2017, 12:28


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

 


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


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