Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2019, 17:46   #1
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию Сбои при обмене по СОМ - порту

Добрый день.

Проблема такая: программа по СОМ - порту со скоростью 115200 бит/с
передает на внешнее устройство байт; в ответ на это устройство выдает, а программа получает, один и тот же байт = 0хА.
Программа сравнивает полученный байт с 0хА и считает число несовпадений.

Вот данные проверки на нескольких ПК:
№1: ошибок 50%, Windows 7 Professional (СОМ-порт на материнской плате);
№2: ошибок 0,3%, Windows 7 Professional (СОМ-порт дополнительная карта);
№3: ошибок 1%, Windows ХР (СОМ-порт дополнительная карта);
№4: миллион передач - 0 ошибок, Windows 7 Максимальная (СОМ-порт на материнской плате, работает также и с USB-COM);
№5: ошибок нет, ноутбук с Windows ХР;
№6: ошибок нет, Windows 7 Максимальная.

Один и тот же драйвер COM - порта.

Используются функции WriteFile() и ReadFile() в одном потоке.
Вставка Sleep() между вызовами в цикле результатов не принесла.

Буду признателен за любые соображения.
Dmitry_B вне форума Ответить с цитированием
Старый 12.04.2019, 18:21   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Помехи?
Black Fregat вне форума Ответить с цитированием
Старый 12.04.2019, 18:25   #3
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Помехи?
Все возможные функции проверки состояния вызывал - нет ошибок.
И ни разу не было пропущено ни одного символа (это тоже подсчитывается).
Dmitry_B вне форума Ответить с цитированием
Старый 12.04.2019, 18:40   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Dmitry_B,
№1 Плохой контакт разъёма.
№2 Какие-то помехи. Смотреть запоминающим осциллограф или анализатором цепей. Возможно иголки по по питанию лезут. Либо фронты кривые.
300/100000
№4 Отлично работает. 50 ошибок на миллион бод допустимо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 12.04.2019, 18:45   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
Все возможные функции проверки состояния вызывал - нет ошибок.
Вы помехи от ошибок отличаете?

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
И ни разу не было пропущено ни одного символа (это тоже подсчитывается).
1% вероятность искажения одного бита какая вероятность искажения 2-х последних битов в посылке из 10 бит?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 12.04.2019, 19:01   #6
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Вы помехи от ошибок отличаете?


1% вероятность искажения одного бита какая вероятность искажения 2-х последних битов в посылке из 10 бит?
Помехи никогда не приводят к ошибкам, которые бы обнаруживались аппаратурой СОМ-порта - Вы это утверждаете?
Dmitry_B вне форума Ответить с цитированием
Старый 12.04.2019, 20:54   #7
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Dmitry_B Посмотреть сообщение
Помехи никогда не приводят к ошибкам, которые бы обнаруживались аппаратурой СОМ-порта - Вы это утверждаете?
Помехи приводят к искажениям байт. А аппаратная диагностика может не сработать.

Bit 2: This bit is the Parity Error (PE) indicator. Bit 2 indicates
that the received data character does not have the
correct even or odd parity, as selected by the even-parityselect
bit. The PE bit is set to a logic 1 upon detection of a
parity error and is reset to a logic 0 whenever the CPU reads
the contents of the Line Status Register. In the FIFO mode
this error is associated with the particular character in the
FIFO it applies to. This error is revealed to the CPU when its
associated character is at the top of the FIFO.
Bit 3: This bit is the Framing Error (FE) indicator. Bit 3 indicates
that the received character did not have a valid Stop
bit. Bit 3 is set to a logic 1 whenever the Stop bit following
the last data bit or parity bit is detected as a logic 0 bit
(Spacing level). The FE indicator is reset whenever the CPU
reads the contents of the Line Status Register. In the FIFO
mode this error is associated with the particular character in
the FIFO it applies to. This error is revealed to the CPU
when its associated character is at the top of the FIFO. The
UART will try to resynchronize after a framing error. To do
this it assumes that the framing error was due to the next
start bit, so it samples this ``start'' bit twice and then takes in
the ``data''.



Для скорости 115200 используется режим FIFO в режиме FIFO.
Потеря Байта у вас будет если вы потеряете 2 стоповых и 2 стартовых бита.
Вероятность искажения байта 1% одного бита 0.1% вероятность искажения 4-х подряд идущих битов
0,001^4= 0.000000000001
(1/0.000000000001)/115200=8 680 555 секунд = 100 дней. Т.е потеря 1 байта вы зафиксируете через 100 дней. Вы просто не дождались.


50%
(1/0,00000625)/115200= 1,3 секунд. Т.е. потеря одного байт раз в 1,3 секунды

А режим передачи у вас скорее всего без паритетного бита поэтому флаг тоже ничего и не показывать. А если с паритетным битом то надо что-бы ошибка попала на верхушку стека. Если ошибка детерменированная, а не случайная то она может попадать на одни и тежи биты, а с учётом того что из стека вчитывается допустим по 8 байт. Она может ни разу не попасть на верхушку стека, а байты будут приходить искажёнными.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 12.04.2019 в 20:58.
Pavia вне форума Ответить с цитированием
Старый 13.04.2019, 05:53   #8
Dmitry_B
Пользователь
 
Регистрация: 29.03.2009
Сообщений: 82
По умолчанию

Передача байта - пауза - прием байта и анализ - пауза - передача байта...
Вот алгоритм.
Буфер приема пуст. Анализируется прием каждого байта.
Вероятность ошибки от длительности пауз не зависит - проверено.
В расчетах вероятностей не учитывается, что ошибка в оценке начала передачи - старт-бита, приводит к ошибке приема всех последующих бит, включая стоп-бит.
Dmitry_B вне форума Ответить с цитированием
Старый 13.04.2019, 07:46   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

При передаче через COM-порт всегда есть опасность ошибок, тем более на таких скоростях. Поэтому тот же modbus, например, предусматривает crc и квитирование
Black Fregat вне форума Ответить с цитированием
Старый 13.04.2019, 11:26   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

- Не отвечено, используется ли бит паритета. Без него дальнейший анализ бессмысленен, потому что без него любая ахунея аппаратно будет воспринята как правильный байт. Да и бит паритета - не панацея, любое четное количество ошибок взаимно компенсируется, а потому - см. #9
- Таинственное устройство имеет реальный COM-порт или через преобразователь COM-UART? Во втором случае могут играть рояль уровни COM-порта, т.к. насколько помнит мой склероз, у бука и десктопа они могут быть разные.
- На меньших скоростях пробовали ?
- Я бы в принимающей проге, кроме подсчета несовпадений, поставил бы небольшой приемный буфер, куда записывал бы при несовпадении - а что мы приняли? Информация к размышлению.
---------------------------------------------
А вообще указанный опыт только подтверждает банальную истину - @ при передаче инфы по каналу вероятность правильного приема <= 100%. Какой канал больше подвержен - это исследуется не умозрительным анализом, а приборно. И в любом случае - воспринимаем @ как данность и при проектировании реальных сетей обмена данными применяем общеизвестные алгоритмы обнаружения/корректировки ошибок. Ну если это лаба, то ...

Последний раз редактировалось digitalis; 13.04.2019 в 11:43.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
симметричное шифрование при обмене клиент - сервер sfu C# (си шарп) 1 24.12.2015 15:09
ESB - посредник при обмене данными antirek Общие вопросы по программированию, компьютерный форум 0 18.12.2013 10:13
Сбои во время работы программы Slid Show ArtGrek Общие вопросы Delphi 8 11.03.2011 10:12
Вирусы и сбои системы. Lunex.08 Безопасность, Шифрование 9 12.01.2010 17:49
создали на бесплатном сервере форум,раскрутили,но случились сбои на серваке и форум перестал работать Тырц WordPress и другие CMS 17 17.09.2009 20:22