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

 
 
> Обнаружение ошибок чётности и др. при приёме ч/з COM порт, В винде
forever failure
сообщение Mar 8 2010, 05:17
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 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 - там всё чётко работает - обнаруживаются все заваленные байты, а правильно отправленные (безошибочные) байты не маркируются как ошибочные, при работе и через реальный и через виртуальный последовательный порт. Можно было бы достичь того же результата в винде ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Mar 13 2010, 09:35
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(galjoen @ Mar 12 2010, 11:52) *
А синхронизацию в UART лучше всего

Равноправные варианты пакетной синхронизации:
1. При 9-битах (не к этой теме, по все же) - прием байта адреса (бит9=1)
2. Посылка BREAK, прочищающего мозги всем и откидывающего на дефолтные настройки
3. По модбасовски - тайм-аут между посылками
4. Преамбула 0х55 (одновременно и автонастройка скорости, кто может)
5. Любой символ, считающийся признаком начала пакета с разруливанием двойного толкования этого символа (эскейп-последовательности).
6. Самосинхронизация за счет длины пакета и контрольной сигнатуры - например, длина пакета не более 10байт, сигнатура, как в далласах(onewire) - пожалста, приняли байт, отсчитали от него назад контрольную сумму в окне, не более длины пакета, если совпало с принятым байтом - пакет принят.
Все это так или иначе делал. Сказать, что какой-нить из методов (особенно спорный №6) - полный ацтой - не скажу. Номер шесть тоже вполне ничего.

Цитата(firstvald @ Mar 12 2010, 14:46) *
Не-а. В modbus rtu никаких своих чудес вставлять нельзя в протокол (вставить можно но толку от этого никакого , наоборот еще больше ждать надо будет). Можно только в символьный. Так что, именно пауза, так скажем в 10 интервалов передачи байта на данной скорости, прочищает мозги принимающему UARTU. А лучше еще побольше - это уже чтобы протокольная прога поняла, что больше ей ничего не придет.

Есть минимально различимые паузы. Если девайсы вместе с программистом, их воспитавшим, курят траву, то это не модбас. В случае необходимости в устройстве заводится регистр, содержащий значение минимально допустимого тайм-аута для данного девайса, если он уж совсем тормозной. Т.е. если ему что-то отстучали, и он не принял, то более того, что прежде прочитано из регистра, ждать нет смысла. Правда, это мимо стандарта, регистр может находиться на каком угодно адресе...
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 13 2010, 17:25
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(zltigo @ Mar 12 2010, 16:25) *
Вот именно для отладки и именно в изделии, и именно на объекте UART и надо использовать. А JTAG (подключение+железо+драйвера+офигенный софт)в этих условиях гарантированно идет лесом.

В моих условиях не только JTAG, но и USART идут лесом ибо не только человек (высокое напряжение), но и комп (с UART) там просто не поместится. Пользуюсь флешкой с SPI - сильно помогает. Поэтому про JTAG написал чисто теоретически, если не прав, то пусть будет так.
Цитата(zltigo @ Mar 12 2010, 16:25) *
А еще пофантазировать? А в бубен, постучать? Шаманы рекомендуют.....

Если вы знаете способ лучше, как восстановить байтовую синхронизацию в непрерывном потоке данных (8N1) то так и напишите, а в бубен постучим параллельно.
Цитата(_Pasha @ Mar 13 2010, 12:35) *
Равноправные варианты пакетной синхронизации:
1. При 9-битах (не к этой теме, по все же) - прием байта адреса (бит9=1)
2. Посылка BREAK, прочищающего мозги всем и откидывающего на дефолтные настройки
3. По модбасовски - тайм-аут между посылками
4. Преамбула 0х55 (одновременно и автонастройка скорости, кто может)
5. Любой символ, считающийся признаком начала пакета с разруливанием двойного толкования этого символа (эскейп-последовательности).
6. Самосинхронизация за счет длины пакета и контрольной сигнатуры - например, длина пакета не более 10байт, сигнатура, как в далласах(onewire) - пожалста, приняли байт, отсчитали от него назад контрольную сумму в окне, не более длины пакета, если совпало с принятым байтом - пакет принят.
Все это так или иначе делал. Сказать, что какой-нить из методов (особенно спорный №6) - полный ацтой - не скажу. Номер шесть тоже вполне ничего.

По пунктам 1,4,5 - после потери байтовой синхронизации (стартовый бит принимается как бит данных) работать не будет.
П. 2 - таймаут может помехой быть изменён на 0xFF, 0xEF и т.д.
П. 6 не спорный, а вынужденный под win - тоже делал.
Но по теме, с учётом ограничений родного драйвера в win, остаются только 2, 6 (вынужденный) и отчасти 3 (модбас), но там время паузы может стать слишком большим. Да и вообще, модбасу давно на пенсию пора...
Собственно, только 2 то под win и остаётся...

А USB я успешно использую в условиях 6..10кВ * 1..2кА. Работает под lin. Там к хабу без без проблем обратится можно. И если потеряется EOP и хаб отключит мой девайс (в этом ведь проблема USB), то тут-же переподключаюсь и всё - 5 мСек max. Но если нет 5 мСек ограничения, то можно и по win работать - даже со стороны девайса всё решается. Только уже порядка 50 мСек будет.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 13 2010, 19:28
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(galjoen @ Mar 13 2010, 20:25) *
По пунктам 1,4,5 - после потери байтовой синхронизации (стартовый бит принимается как бит данных) работать не будет.

Дык как же не будет? Это бит данных может быть воспринят как стартовый - я это понимаю.
По этой причине вопросы могут быть к п.1 и 5.
Про п.1 - ничего не скажу, там где использую 9 бит, посылка идет с паузой между байтами.
А п.5 - на символ начала можно наложить ограничения, забив старшие биты единицами.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 14 2010, 14:31
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(_Pasha @ Mar 13 2010, 22:28) *
А п.5 - на символ начала можно наложить ограничения, забив старшие биты единицами.

По п. 4 передача первым символа 0x55 это хорошее решение, но не для приёма компом. МК может 0x55 вообще с помощью входа захвата принять и настроится, а комп - нет. Для компа лучше уж 0xFF передавать. Как, собственно, и по п. 5. Но два 0xFF подряд будет ещё лучше.
Цитата(firstvald @ Mar 14 2010, 15:48) *
Тема топика - что делать при приеме с паритетом.

Ничего не делать - отказаться от паритета как от устаревшего и неэффективного решения. Паритет, этот CRC1 - совершенно неэффективен. Если принимается от 10 байт, то CRC8 на все эти байты займёт времени меньше, чем паритет. А уж эффект несравнимо выше будет. А CRC16 и CRC32 с CRC1 даже и сравнивать смешно...
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 14 2010, 14:51
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(galjoen @ Mar 14 2010, 18:31) *
отказаться от паритета как от устаревшего и неэффективного решения.

Для ограниченного набора символов - никогда он не устареет. Еще вспоминается темка из одной хорошей книжки по помехоустойчивому кодированию. Рассматривается блок данных, пусть это будут биты
Код
b0  b1  b2  p1
b3  b4  b5  p2
b6  b7  b8  p3
p4  p5  p6  p7

p[i] - это биты полученные путем xor по строкам и столбцам. Такой блочок данных позволяет восстановить все одиночные и часть двойных ошибок. Если совсем не фантазировать, то
Код
b0 b1 p1
b2 b3 p2
p3 p4 p5

такой блочок (р5 - паритет) позволяет исправить все двойные ошибки
Извините за оффтоп.
Go to the top of the page
 
+Quote Post
galjoen
сообщение Mar 14 2010, 16:17
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(_Pasha @ Mar 14 2010, 17:51) *
p[i] - это биты полученные путем xor по строкам и столбцам.

Это называется поблочный контроль чётности. Он низкоэффективен и бессилен против ошибок возникающих в чётном кол-ве строк. А использовать для восстановления 4-х бит данных 5 дополнительных бит - это уже слишком. Есть методы получше.
Насчёт поблочного контроля в частности, и насчёт обнаружения и исправления ошибок вообще, очень хорошо и понятно написано тут: Р.Л.Хаммел Последовательная передача данных.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
- - @Ark   ЦитатаБред. Изложите, тогда, "свой бред...   Mar 8 2010, 20:06
|- - galjoen   Цитата(@Ark @ Mar 8 2010, 23:06) После сб...   Mar 9 2010, 10:06
|- - zltigo   Цитата(@Ark @ Mar 8 2010, 23:06) Медленно...   Mar 9 2010, 10:24
|- - galjoen   Цитата(zltigo @ Mar 9 2010, 13:24) Для во...   Mar 9 2010, 10:53
|- - zltigo   Цитата(galjoen @ Mar 9 2010, 13:53) Сейча...   Mar 9 2010, 14:00
|- - galjoen   Цитата(zltigo @ Mar 9 2010, 17:00) Ну а е...   Mar 12 2010, 08:52
|- - 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
- - 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


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 22:11
Рейтинг@Mail.ru


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