|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.04.2019, 17:46 | #1 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
Сбои при обмене по СОМ - порту
Добрый день.
Проблема такая: программа по СОМ - порту со скоростью 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() между вызовами в цикле результатов не принесла. Буду признателен за любые соображения. |
12.04.2019, 18:21 | #2 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
Помехи?
|
12.04.2019, 18:25 | #3 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
|
12.04.2019, 18:40 | #4 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Dmitry_B,
№1 Плохой контакт разъёма. №2 Какие-то помехи. Смотреть запоминающим осциллограф или анализатором цепей. Возможно иголки по по питанию лезут. Либо фронты кривые. 300/100000 №4 Отлично работает. 50 ошибок на миллион бод допустимо.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
12.04.2019, 18:45 | #5 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Вы помехи от ошибок отличаете?
1% вероятность искажения одного бита какая вероятность искажения 2-х последних битов в посылке из 10 бит?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
12.04.2019, 19:01 | #6 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
|
12.04.2019, 20:54 | #7 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
Цитата:
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. |
|
13.04.2019, 05:53 | #8 |
Пользователь
Регистрация: 29.03.2009
Сообщений: 83
|
Передача байта - пауза - прием байта и анализ - пауза - передача байта...
Вот алгоритм. Буфер приема пуст. Анализируется прием каждого байта. Вероятность ошибки от длительности пауз не зависит - проверено. В расчетах вероятностей не учитывается, что ошибка в оценке начала передачи - старт-бита, приводит к ошибке приема всех последующих бит, включая стоп-бит. |
13.04.2019, 07:46 | #9 |
Программист
Участник клуба
Регистрация: 23.06.2009
Сообщений: 1,772
|
При передаче через COM-порт всегда есть опасность ошибок, тем более на таких скоростях. Поэтому тот же modbus, например, предусматривает crc и квитирование
|
13.04.2019, 11:26 | #10 |
Старожил
Регистрация: 04.02.2011
Сообщений: 4,619
|
- Не отвечено, используется ли бит паритета. Без него дальнейший анализ бессмысленен, потому что без него любая ахунея аппаратно будет воспринята как правильный байт. Да и бит паритета - не панацея, любое четное количество ошибок взаимно компенсируется, а потому - см. #9
- Таинственное устройство имеет реальный COM-порт или через преобразователь COM-UART? Во втором случае могут играть рояль уровни COM-порта, т.к. насколько помнит мой склероз, у бука и десктопа они могут быть разные. - На меньших скоростях пробовали ? - Я бы в принимающей проге, кроме подсчета несовпадений, поставил бы небольшой приемный буфер, куда записывал бы при несовпадении - а что мы приняли? Информация к размышлению. --------------------------------------------- А вообще указанный опыт только подтверждает банальную истину - @ при передаче инфы по каналу вероятность правильного приема <= 100%. Какой канал больше подвержен - это исследуется не умозрительным анализом, а приборно. И в любом случае - воспринимаем @ как данность и при проектировании реальных сетей обмена данными применяем общеизвестные алгоритмы обнаружения/корректировки ошибок. Ну если это лаба, то ... Последний раз редактировалось digitalis; 13.04.2019 в 11:43. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
симметричное шифрование при обмене клиент - сервер | 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 |