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

 
 
> Обнаружение ошибок чётности и др. при приёме ч/з 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

Сообщений в этой теме
- 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
|- - _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


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 18:36
Рейтинг@Mail.ru


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