|
Windows7: прием байтов через COM-порт без потерь, Кто-то имеет личный опыт? чем побороть потерю отдельных байтов? |
|
|
|
May 22 2017, 06:27
|
Гуру
     
Группа: Свой
Сообщений: 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. куда копать? Сильно надеюсь что моя программа виновата. На другом железе пробовал- эффект тот же, то есть это не электроника глючит. С приоритетами игрался, никакого эффекта. Заранее спасибо за любые советы (по существу).
|
|
|
|
|
 |
Ответов
|
May 29 2017, 11:07
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Ваш снифер умеет показывать ошибки от COM порта? Если да, то включите их показ. Возможно байт не принялся по причине Framing Error. Еще попробуйте осцилографом замерить точную частоту (время битового интервала). Потом включите порт на передачу и замерьте то же самое от РС (например через какой нибудь терминал). Если разница будет более 5% - то это оно  Если более 1% - то может быть оно. Ну и уровни проверьте. Настоящий COM порт должен обеспечивать +/- 12В, но лично я таких давно не видел. Обычно все в районе 5-10В бегает. У меня даже был один сервер с COM портом который отказался свои же собственные уровни воспринимать (выдавал на выход 5В, на входе хотел не менее 7-8В)
|
|
|
|
|
May 29 2017, 12:24
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(XVR @ May 29 2017, 13:58)  Ключевое слово 'правильные'. Кто знает, что именно поставили китайцы в RS232 на этом РС? Ребята, ну нельзя же так уж совсем. Уже сколько раз вижу ситуации про чукчу, который ни разу ни читатель. Я уже говорил, что пробовал на разных компьютерах. Правда, всегда под Win7. Если бы мне еще кто-нибудь сказал как детектировать вероятное падение амплитуды на пару байт в течении ну хоть часа без долгозаписывающего осциллографа- скажу спасибо. понятно, что я в первую очередь про уровни подумал, еще месяц назад. Проверил в онлайне, но детальную долговременную запись аналогового сигнала и синхронизацию с цифрой не делал. Первое что пришло в голову- виртуальный скоп на саундбластере, но он мои 55 килогерц не возьмет, а если вдруг и возьмет, то ни о какой достоверности измеряемого уровня на разных байтах говорить не приходится. Пока что провожу симптоматичное лечение и тесты для локализации проблемы. Надеюсь что это глюки в подключенном к сериальному порту девайсе (конвертере RS485/232), с кратковременных падением уровня. Но опять же, пробовал и другие адаптеры, правда из той же серии (используется Мокса с опторазвязкой). попробую что-то еще. Очень может быть что проблема многоуровневая. Буквально на прошлой неделе такое решал- проблема одновременно была и Матлабовском скрипте, и в формате файла данных, и в методике расчета в устройстве которое считало данные для этого файла, прямо цепочку раскручивал, хотя вначале думал что ошибка просто в скрипте. Но это не в данном устройстве
|
|
|
|
|
May 30 2017, 10:23
|
Знающий
   
Группа: Участник
Сообщений: 688
Регистрация: 13-05-16
Пользователь №: 91 710

|
Цитата(XVR @ May 30 2017, 13:15)  О! Уже RS485 появился  Может дело в стыке RS485 <-> RS232? У RS485 half duplex, а у RS232 - full duplex. И конвертор переключает направление на прием/передачу по RS485 по неким своим законам. Они точно согласуются с реальным потоком данных по RS485? Ибо неверный момент переключения как раз и даст те самые пропущенные байты. Так вроде поток односторонний. Преобразователь RS485-RS232 будет только на прием работать со стороны RS485. Или мы чего-то не знаем опять? ТС говорит, что до разъема PC все байты доходят. В любом случае, надо дождаться проверки "эталонным потоком", непосредственно в порт. Нужно локализовать ошибку, прежде чем гипотезы строить.
|
|
|
|
|
May 30 2017, 17:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
Цитата(@Ark @ May 30 2017, 13:23)  ТС говорит, что до разъема PC все байты доходят. Давайте начнём с того, что ТС не выдаёт полной картины, а рубит хвост кусками. Что уж говорить про "нюансы реализации", которые обходятся за три-девять земель. зы. я даже не удивлюсь, если своей помощью мы ему сейчас на работе могилу копаем.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
May 30 2017, 20:18
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(krux @ May 30 2017, 19:28)  Давайте начнём с того, что ТС не выдаёт полной картины, а рубит хвост кусками. Что уж говорить про "нюансы реализации", которые обходятся за три-девять земель.
зы. я даже не удивлюсь, если своей помощью мы ему сейчас на работе могилу копаем. Да ну прям. Все нормально у меня, только вот времени не хватает ни на что.  Начальство в курсе, что задача не определена по времени решения, договорились что как смогу-так и возьмусь. Сам затягивать не хочу, а то получится- завтра в отпуск, а сегодня вечером клиент прибежал с вопросам про. Вам действительно нужна поможет полная картина вплоть до цвета стен в комнате где оборудование стоит? Вряд ли. Я потому и не даю полную картину, чтоб не начали сыпать советами стены в другой цвет перекрасить. Проблема локализована участком "на входном разъеме компьютера логический анализатор байты видит, а сниффер в компьютере уже не видит". И зачем множить сущности, рассказывая про симплексы и дуплексы?. Понимаю, что случаи разные бывают, я за свой уже довольно длительный экспириенс тоже много чего видел и еще больше слышал, но пока что буду копать в данном куске, вот только не знаю когда. Если есть действительно что-то могущее повлиять на поведение в пределах указанного мной "бермудского треугольника" -то я ж не против чего-нить пояснить. Но множить сущности без нужды не стану. Уважаемые форумчане, не обижайтесь пожалуйста, если кажется что я из вредножадности что-то скрываю от вас, не так это. Upd: а как красиво все начиналось, неправильно параметры между тредами передаю, эх, прям прослезиться тянет насколько зеленый был... Интересно, что я через неделю буду думать про сегодняшнее положение вещей...
|
|
|
|
Сообщений в этой теме
Ruslan1 Windows7: прием байтов через COM-порт без потерь May 22 2017, 06:27 AlexRayne Цитата(Ruslan1 @ May 22 2017, 10:27) Есть... May 22 2017, 08:15 Ruslan1 AlexRayne, большое спасибо за конструктивный ответ... May 22 2017, 12:23  AlexRayne Цитата(Ruslan1 @ May 22 2017, 16:23) Alex... May 23 2017, 09:20   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    @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 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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|