maik-vs 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Господа электронщики, как определять скорость USARTa в случае,когда мы знаем,какой именно байт должен быть принят - дело понятное. Практически у каждого производителя МК есть статья с алгоритмом,который сводится к тому,что просто сравниваем,какой байт получился на приёме с табличными значениями и определяем скорость. ВОПРОС: какой алгоритм должен быть при autobaudrate,если из канала мы получаем произвольные данные и не можем предсказать,что именно. Т.е. могут быть,как все нули, так и все единицы и пр. Sasa из Vitebsk Вы попытались описать данный алгоритм,но не совсем ясно,как он работает. Может у кого есть ещё какие-нибудь идеи????? Ну так поставьте себя на место UARTa. Вот в линии нулевой уровень. Долго. Так долго, что даже длиннее байта на скорости 100 бод. И вдруг перепад. Это начался старт-бит. Дальше остаётся только мерить время между перепадами и соображать, где бит, где байт, где пауза (если есть!) - после неё будет старт-бит. Заметьте, что задачка распадается на две: когда на борту есть кварц и вы можете прикинуть длительность принятых бит к стандартному ряду скоростей, или когда есть RC генератор и вы не знаете, сколько, образно говоря, тиков таймера пойдёт на бит при скорости 9600. Ну и, конечно, "произвольные данные" должны быть ограничены требованиями протокола. Не представляю себе полностью неопределённый поток - разве что когда подслушиваешь кого-нибудь :) Кстати, очень интересно было нарваться на поток данных без пауз, по RS485. Отлично принималось, начиная с произвольного нулевого бита в байте, и при изменении полярности - тоже, всего лишь с инверсией! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ARV 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба в принципе, для абсолютно неизвестного потока данных можно долго слушать линию, замеряя длительность всех сигналов и выбирая наименьший - это и будет длителность одного бита - по ней скорость и восстанавливать... хотя все равно возникает другая сложность - определение длины кадра - 8 бит данных или 9... :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Sasa из Vitebsk Вы попытались описать данный алгоритм,но не совсем ясно,как он работает. Может у кого есть ещё какие-нибудь идеи????? В моём посте абсолютно подробно, по пунктам расписано. Я не привязываюсь к конкретному байту. Я восстанавливаю любой. При этом надо понимать, что есть байты которые (за 1 байт) не могут быть восстановлены. Надеюсь это понимает каждый? Для Maik-vs, в линии изначально 1 и старт-бит приходит 0. Далее если вы распишете например байт 0xf0(на 115200), то вы поймёте, что он может быть 0xf0 на 115200, или 0xfc на 57600 или 0xfe на 28800 или 00 на 230400. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба ВОПРОС: какой алгоритм должен быть при autobaudrate,если из канала мы получаем произвольные данные и не можем предсказать,что именно. Т.е. могут быть,как все нули, так и все единицы и пр.Для начала надо понять что для произвольного входного потока понадобятся от 1 до ~9-11 байт входного потока для первоначальной синхронизации, если вас устроит синхронизация по такой последовательности, тогда можно обсуждать дальше... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба ...Уточнение, для совсем произвольного входого потока(это когда промежутки между байтами неопределенные), скорее всего нужно как минимум ~ 20байт для первоначальной синхронизации, а дальше только один вопрос, а оно надо... ??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Для непрерывного потока, когда устройство налету врезается в уже передаваемые данные - задача просто не решаемая на rs232. Только посредством специализированного протокола, где есть поле синхронизации и байт маркер. Если рассматривать, что принимается посылка, то есть сначала линия неактивна и вот пошёл первый байт, то тогда я описал ситуацию, правда я там немного ошибся - ну да ладно. Это не принципиально. Главное что существуют символы где будет один импульс. В этом случае нельзя достоверно по одному байту определить скорость. Но таких символов очень мало. Примерно 99% будут восстановлены грамотно. Если же стоит задача полностью определить 100% символов, то выход - полностью программный анализ входного протокола. Я уверен, что на скорости >=8МГц при том, что однокристалка будет занята этой задачей, я бы восстановил любую многобайтовую посылку от 300 бод до 115200. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Для непрерывного потока, когда устройство налету врезается в уже передаваемые данные - задача просто не решаемая на rs232. Только посредством специализированного протокола, где есть поле синхронизации и байт маркер.Для непрерывного потока как раз все просто, Вы забываете в своем анализе что всегда стартовый бит это переход 1->0 а стоповый наоборот. ну и нужно конечно успет накопить статистику(может за 1 байт а может и за 20) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Для непрерывного потока как раз все просто, Вы забываете в своем анализе что всегда стартовый бит это переход 1->0 а стоповый наоборот. ну и нужно конечно успет накопить статистику(может за 1 байт а может и за 20) Только есть шанс необнаружить этот стоп бит а засинхронизароваться посреди байта и благополучно принимать послудующую инфу неправильно. Здесь как раз тема была. Парень передавал 55 а получал что угодно в зависимости от удачности врезания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sf9 0 16 октября, 2008 Опубликовано 16 октября, 2008 · Жалоба Я тоже считаю,что для определения скорости на лету с полным восстановлением данных и без байта синхронизации - задача под rs232 практически нерешаема. Так,для самоуспокоения,хотел посоветоваться,может кто-то знает путь решения задачи. Всё-равно,спасибо всем за идеи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maik-vs 0 16 октября, 2008 Опубликовано 16 октября, 2008 · Жалоба Для Maik-vs, в линии изначально 1 и старт-бит приходит 0. Далее если вы распишете например байт 0xf0(на 115200), то вы поймёте, что он может быть 0xf0 на 115200, или 0xfc на 57600 или 0xfe на 28800 или 00 на 230400. Я это понимаю, про f0 - fc - fe. Насмотрелся :). А про 0 и 1 приучен не говрить, лучше уж говорить в терминах уровней "высокий-низкий". Потому что когда работал с ТТЛ и ЭСЛ, д аещё и интерфейсы - тады ой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 16 октября, 2008 Опубликовано 16 октября, 2008 · Жалоба Только есть шанс необнаружить этот стоп бит а засинхронизароваться посреди байта и благополучно принимать послудующую инфу неправильно. Здесь как раз тема была. Парень передавал 55 а получал что угодно в зависимости от удачности врезания.Я имел в виду что скорость потока за ~20 байт мы можем выяснить гарантированно. Для синхронизации конечно нужны паузы в потоке или достаточно длительное накопление статистики и сдвиги на 1 бит до получения потока с правильными стоп битами(наименьший % ошибок кадра). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ae_ 2 17 октября, 2008 Опубликовано 17 октября, 2008 · Жалоба Я имел в виду что скорость потока за ~20 байт мы можем выяснить гарантированно. Формат передачи 8-N-1, неприрывная серия байт: 0x55 @ speed 1x ничем не отличается от 0x0F @ speed 5x 0xF8 @ speed 1x -//- от 0xCE @ speed 2x 0x08 @ speed 1x -//- от 0x80 @ speed 2x Т.е. нельзя выяснить скорость произвольного потока ни за 20 байт, а вообще нельзя, если в нём встречаются только две длительности нулей и единиц - 1/1, 2/3, 1/5, как в приведённых выше примерах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
singlskv 0 17 октября, 2008 Опубликовано 17 октября, 2008 · Жалоба Т.е. нельзя выяснить скорость произвольного потока ни за 20 байт, а вообще нельзя, если в нём встречаются только две длительности нулей и единиц - 1/1, 2/3, 1/5, как в приведённых выше примерах.Я согласен что есть несколько вырожденных случаев при которых передается один неизменный байт, наверное слово "гарантированно" было не совсем правильным. Если же байты изменяются то определить скорость практически всегда возможно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
galjoen 0 17 октября, 2008 Опубликовано 17 октября, 2008 · Жалоба Делал автобауд для USART и для CAN (AT90CAN128). Подобно тому, как писал SasaVitebsk. Отличие в том, что у меня процессор был занят, и пришлось использовать входы захвата таймеров. Один захватывал фронт, другой спад (прерывание от обоих). Получалась длительность нуля или единицы. Далее, по заранее рассчитанной таблице, прибавлял баллы накопителям (одному или нескольким), соответствующим скоростям от 1200 до 115200 бод. Причём, если длина соответствовала скорости неточно - баллов добавлял меньше (SasaVitebsk, а как вы дейсвовали в таком случае?). Скорость считалась определённой, когда один из накопителей переполнялся. Какой первым переполнился - такая и скорость. Конечно я согласен, что можно найти такие данные на которых данный алгоритм проколется, но в реальности я с этим не сталкивался. Кстати в случае CAN такой алгоритм (ну несколько модифицированный) всегда безошибочно срабатывает с 1й посылки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Джеймс 3 17 октября, 2008 Опубликовано 17 октября, 2008 · Жалоба Скачайте с gaisler.com библиотеку grlib-gpl Там как как раз в DSU UART есть автоопределение Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться