|
Обнаружение ошибок чётности и др. при приёме ч/з COM порт, В винде |
|
|
|
Mar 8 2010, 05:17
|
Местный
  
Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112

|
Всем доброго. Ув. эксперты, поскажите, есть ли в виндовых осях возможность обнаруживать ошибки контроля чётности и другие (CE_FRAME, CE_OVERRUN) при получении данных побайтно по последовательному порту ? Пробую тестовую программу - внешним устройством (контроллером) посылается поток байт - часть с ошибкой чётности (точнее, просто с перевёрнутой чётностью), часть - без ошибок. Принимающая часть (программа под виндой) распознаёт только ошибку в самом первом испорченном байте, остальные почему-то молча пропускает - это при приёме через встроенный железный COM порт. При прохождении через виртуальный COM порт (переходник USB<->COM FT232) ещё хуже - не только пропускаются ошибочные байты, но и метятся ошибочными безошибочные данные. Приём и проверка выполняется вот таким кодом: CODE static int read_byte (HANDLE handle, uint8_t * byte) { uint8_t b; DWORD ret; if (!ReadFile (handle, &b, 1, &ret, 0)) return -1;
if (0 == ret) return 0;
DWORD err; ClearCommError (handle, &err, 0);
if (err) { fprintf (stderr, "\nComm Error: "); fprintf (stderr, CE_FRAME & err ? "F" : "-"); fprintf (stderr, CE_RXPARITY & err ? "P" : "-"); fprintf (stderr, CE_IOE & err ? "I" : "-"); fprintf (stderr, CE_OVERRUN & err ? "O" : "-"); fprintf (stderr, CE_RXOVER & err ? "B" : "-"); fprintf (stderr, " = %02X ", b); return -2; }
*byte = b; return 1; } Есть код аналогичного назначения под Linux - там всё чётко работает - обнаруживаются все заваленные байты, а правильно отправленные (безошибочные) байты не маркируются как ошибочные, при работе и через реальный и через виртуальный последовательный порт. Можно было бы достичь того же результата в винде ?
|
|
|
|
|
 |
Ответов
Guest_@Ark_*
|
Mar 8 2010, 20:06
|
Guests

|
Цитата Бред. Изложите, тогда, "свой бред". Сравним. ... Цитата Гарантированные "Паузы" есть - это стоп-старт биты. При ошибках внутренняя логика UART рестартует и осуществляет поиск нового фрейма. Таким образом достоверность байта следующего за сбойным по анализу трех бит (start-parity-stop) гарантируется железом. Вот это действительно бред. После сбоя ничего уже не гарантируется... Медленно и печально перечитайте пост №3.
|
|
|
|
|
Mar 9 2010, 10:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(@Ark @ Mar 8 2010, 23:06)  Медленно и печально перечитайте пост №3. Вот именно эти Ваши "гипотезы" о том, что в течении времени образуется разрыв, куда пропадают биты я и называю бредом. Цитата(galjoen @ Mar 9 2010, 13:06)  Гарантируется с того момента, как будет принят байт 0xFF Для восстановления БАЙТОВОЙ синхронизации глубоко безразлично по какому байту восстанавливаться. Цитата(galjoen @ Mar 9 2010, 13:06)  Но вот из-за того, что ошибки в win хранятся не на каждый принятый байт (хотя железо 16550 это позволяет) 1. Позволяет с оговорками. 2. Вы читаете НЕ из железа, а из многокилобайтовых буферов операционной системы - тогда и их пришлось-бы расширять. 3. Пишите свои драйвера - никто не запрещает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 9 2010, 10:53
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(zltigo @ Mar 9 2010, 13:24)  Для восстановления БАЙТОВОЙ синхронизации глубоко безразлично по какому байту восстанавливаться. Что в вашем понимании значит БАЙТОВАЯ синхронизация? Я так считаю, что БАЙТОВАЯ синхронизация имеется, когда стартовый бит принимается именно как стартовый, а не как бит данных. Вот это гарантированно произойдёт после появления в линии 2-х последовательных байтов FF (после сбоя синхронизации правильно примется только 2-й). А вот передача байтов 0xAA - самый худший вариант для восстановления байтовой синхронизации. Цитата(zltigo @ Mar 9 2010, 13:24)  1. Позволяет с оговорками. 2. Вы читаете НЕ из железа, а из многокилобайтовых буферов операционной системы - тогда и их пришлось-бы расширять. 3. Пишите свои драйвера - никто не запрещает. 2. Многокилобайтовые буфера стали бы в 2 раза больше, если бы в них было по 2 байта на каждый принятый байт. По современным меркам это мизер. 3. Драйвера писать не буду. На мой взгляд использование USART в компе, при наличии там USB хоста, это анахронизм. Сейчас, при появлении 3-х долларовых МК с USB девайсом на борту использование RS-232 для подключения к компу лишено всякого смысла. Протоколы на базе USART стоит использовать только для связи между МК, при только при соединении точка-точка. А в остальных случаях там CAN лучше, хотя он и пока (!) несколько дороже.
|
|
|
|
|
Mar 9 2010, 14:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(galjoen @ Mar 9 2010, 13:53)  Сейчас, при появлении 3-х долларовых МК с USB девайсом на борту использование RS-232 для подключения к компу лишено всякого смысла. Ну а если подумать о том, какое количество софта, с каким количеством ошибок и какой зависимостью от окружения требуется для облуживания USB? Нужен, например, отладочный интерфейс - при вылете системы через USB стек Вы почти наверняка вообще ничего не увидите. UART, как минималистичная штучка будет востребован еще очень и очень долго. Цитата Протоколы на базе USART стоит использовать только для связи между МК, при только при соединении точка-точка. А в остальных случаях там CAN лучше, хотя он и пока (!) несколько дороже. Практически уже нет и использование UART для организации сетей в стиле 70х годов прошлого века уже не оправдано. Цитата(forever failure @ Mar 9 2010, 16:47)  молоток вместо отвёртки, и другими глубокими мыслями. Вынужден заметить, что "глубокую мысль" использовать Бит-UART-молоток и, полагаю, PIC/AVR до кучи, вместо "отвертки" высказали именно Вы.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 12 2010, 08:52
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(zltigo @ Mar 9 2010, 17:00)  Ну а если подумать о том, какое количество софта, с каким количеством ошибок и какой зависимостью от окружения требуется для облуживания USB? Нужен, например, отладочный интерфейс - при вылете системы через USB стек Вы почти наверняка вообще ничего не увидите. UART, как минималистичная штучка будет востребован еще очень и очень долго. С USB всё не так страшно. Клавиатуры (HID) и флешки (MassStorage) без проблем работают с любым железом и любой ОС. Вот их то (HID+MassStorage) я и использую для связи с компом. А во время отладки, но не в изделии, конечно можно использовать UART, но житаг то получше будет. Хотя, ИМХО и без того и другого вполне успешно можно обходится. А синхронизацию в UART лучше всего не по паузе восстанавливать, а именно по передаче 2-х FF-ов в непрерывном потоке данных. Т.к. в этом случае безошибочный приём FF-а (второго) с весьма высокой вероятностью свидетельствует о восстановлении синхронизации - если помеха 0-й создаст сразу видно. Немного протокол подправить, чтобы пакет с синхронизирующего FF-а начинался и всё. Тогда если этот FF и следующие за ним байты приняты без ошибок, то можно считать, что новый пакет не испорчен. Но на компе при работе через родной драйвер так не сделаешь - ошибки в кучу сливаются.
|
|
|
|
Сообщений в этой теме
forever failure Обнаружение ошибок чётности и др. при приёме ч/з COM порт Mar 8 2010, 05:17 zltigo Цитата(forever failure @ Mar 8 2010, 08:1... Mar 8 2010, 07:12 galjoen Цитата(zltigo @ Mar 8 2010, 10:12) железо... Mar 8 2010, 14:26  zltigo Цитата(galjoen @ Mar 8 2010, 17:26) Почем... Mar 8 2010, 16:31   galjoen Цитата(zltigo @ Mar 8 2010, 19:31) Давайт... Mar 8 2010, 17:25    zltigo Цитата(galjoen @ Mar 8 2010, 20:25) Вот, ... Mar 8 2010, 19:02 @Ark ЦитатаПринимающая часть (программа под виндой) рас... Mar 8 2010, 07:46 forever failure Тогда можно было-бы переформулировать вопрос:
Если... Mar 8 2010, 09:34 zltigo Цитата(forever failure @ Mar 8 2010, 12:3... Mar 8 2010, 10:21 _Pasha Цитата(forever failure @ Mar 8 2010, 13:3... Mar 8 2010, 10:26  zltigo Цитата(_Pasha @ Mar 8 2010, 13:26) Только... Mar 8 2010, 10:33   _Pasha Цитата(zltigo @ Mar 8 2010, 14:33) С чего... Mar 8 2010, 10:42 forever failure Ну я тоже так же и предполагал.
Благодарю за то, ч... Mar 8 2010, 10:36 @Ark Цитата... ошибки в FIFO-режиме хранятся на каждый ... Mar 8 2010, 18:35 @Ark ЦитатаЦитата(zltigo)
При ошибках внутренняя логика... Mar 8 2010, 19:13 zltigo Цитата(@Ark @ Mar 8 2010, 22:13) То есть ... Mar 8 2010, 19:20 @Ark ЦитатаПро правильно ничего не понял...
Правильно р... Mar 8 2010, 19:42 zltigo Цитата(@Ark @ Mar 8 2010, 22:42) Правильн... Mar 8 2010, 20:01 galjoen Цитата(@Ark @ Mar 8 2010, 23:06) После сб... Mar 9 2010, 10:06     zltigo Цитата(galjoen @ Mar 12 2010, 11:52) А во... Mar 12 2010, 13:25      firstvald Цитата(zltigo @ Mar 12 2010, 16:25) Это п... Mar 13 2010, 09:24       zltigo Цитата(firstvald @ Mar 13 2010, 12:24) Ну... Mar 13 2010, 09:43        firstvald Цитата(zltigo @ Mar 13 2010, 12:43) вылез... Mar 13 2010, 16:20         rezident Цитата(firstvald @ Mar 13 2010, 21:20) Жи... Mar 13 2010, 19:31 forever failure Ксати да, тоже ожидал, что обязательно появится не... Mar 9 2010, 13:47 @Ark ЦитатаЦитата(zltigo)
Вот именно эти Ваши "гип... Mar 9 2010, 15:50 zltigo Цитата(@Ark @ Mar 9 2010, 18:50) А я назы... Mar 9 2010, 17:13 @Ark ЦитатаКатегорическое непонимание того, что, как ми... Mar 9 2010, 18:00 zltigo Цитата(@Ark @ Mar 9 2010, 21:00) Речь иде... Mar 9 2010, 18:09 @Ark ЦитатаТолько вот какой "облом" пауза, ко... Mar 9 2010, 18:15 zltigo Цитата(@Ark @ Mar 9 2010, 21:15) ... глав... Mar 9 2010, 18:24 @Ark Цитата... В чем разница? Только в том, что из-за с... Mar 9 2010, 18:37 zltigo Цитата(@Ark @ Mar 9 2010, 21:37) Синхрони... Mar 9 2010, 18:54 @Ark ЦитатаА сделать паузу в "твержении" и НА... Mar 9 2010, 19:10 zltigo Цитата(@Ark @ Mar 9 2010, 22:10) Может и ... Mar 9 2010, 19:31 @Ark ЦитатаНу и как борьбе с ошибками ДАЖЕ ОДИНОЧНЫМИ п... Mar 9 2010, 19:52 zltigo Цитата(@Ark @ Mar 9 2010, 22:52) Почему-т... Mar 9 2010, 20:09 _Pasha Цитата(@Ark @ Mar 9 2010, 23:52) Понятно,... Mar 10 2010, 00:31 @Ark ЦитатаЛожный старт возможен только если в предыдущ... Mar 9 2010, 20:41 firstvald Всего хорошо в меру. Под каждую задачу - свой мет... Mar 11 2010, 09:14 firstvald Не-а. В modbus rtu никаких своих чудес вставлять... Mar 12 2010, 11:46 _Pasha Цитата(galjoen @ Mar 12 2010, 11:52) А си... Mar 13 2010, 09:35 galjoen Цитата(zltigo @ Mar 12 2010, 16:25) Вот и... Mar 13 2010, 17:25  _Pasha Цитата(galjoen @ Mar 13 2010, 20:25) По п... Mar 13 2010, 19:28   galjoen Цитата(_Pasha @ Mar 13 2010, 22:28) А п.5... Mar 14 2010, 14:31    _Pasha Цитата(galjoen @ Mar 14 2010, 18:31) отка... Mar 14 2010, 14:51     galjoen Цитата(_Pasha @ Mar 14 2010, 17:51) p[i] ... Mar 14 2010, 16:17 firstvald Про кругозор советую помолчать. Выношу вам замеча... Mar 14 2010, 12:48 firstvald Первый раз с проблемой паритета столкнулись, когда... Mar 15 2010, 08:57 _Pasha Цитата(firstvald @ Mar 15 2010, 12:57) По... Mar 15 2010, 09:19 firstvald А если старт не ложный? Вот и начинается мешанина ... Mar 15 2010, 17:07 galjoen Цитата(firstvald @ Mar 15 2010, 20:07) А ... Mar 15 2010, 19:50 _Pasha Цитата(firstvald @ Mar 15 2010, 21:07) А ... Mar 15 2010, 23:47 firstvald Согласен Mar 16 2010, 08:48
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|