|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:18 am
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Автоматично дедектиране на скоростта на трансфер по RS485
| Автор |
Съобщение |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
 Автоматично дедектиране на скоростта на трансфер по RS485
Здравейте колеги.
Налага ми се да използвам автоматична настройка на скоростта на серийната комуникация на устройства свързани по RS485 линия. Варианта всяко устройство да се настройва програмно или със джъмпери не ми харесва, затова се замислям за автоматично дедектиране на използваната скорост и самонастройка на устройството на тази скорост. Проблема се явява в това че не мога да използвам някакви специфични битове които да изпратя по магистралата а трябва да използвам съществуващия трафик от съобщения. По принцип скоростта няма да се променя често и веднъж открита не е проблем да се използва до рестартиране не устройството. Същото така не е проблем при началното пускане да не настъпи откриване на скоростта веднага а това може да стане със закъснение от доста приети байтове но без да е известно предварително точно какви байтове ще се изпратят. Ако някои има идея за някакъв алгоритъм за такова сигурно дедектиране на скоростта или пък е реализирал нещо подобно бих се радвал да помогне. Предварително благодаря на всички.
|
| Сря Юни 16, 2010 12:34 pm |
|
 |
|
gicho
Ранг: Форумен бог
Регистриран на: Пон Мар 13, 2006 1:59 pm Мнения: 3867 Местоположение: Габрово
|
Казваш, че не е известно какви ще са байтовете по шината - не е ли дефиниран някакъв протокол, поне формат на хедъра?
Ако се ползва NRZ кодиране, е малко проблемно да се измисли нещо универсално.
Единият вариант е да опиташ да хванеш bit time - да следиш за разстоянието между фронтовете, като запомняш минималното време. Само че трябва да следиш известно време, за да си сигурен че е минал единичен бит (0 или 1) - ако се предават примерно двоично 000011110000111100001111, няма да се получи - трябва да е гарантирано , че данните съдържат единичен бит (010 или 101) за периода на самонастройката.
Като хванеш бит тайма, лесно обръщаш в baud ratе, инициализираш контролера и почваш да получаваш. Естествено, ще трябва да намериш вярната скорост от списъка с възможните - може да си измерил 106us време за бит (т.е. 9430 bps), ама явно ще да е 9600 истинската.
Като пример, има нещо подобно в някой CAN контролери, но там си има гаранция за идването на единичен бит, и отделно лесно може да се провери дали съобщението е прието на правилния baud rate по CRC-то на фрейма.
Ако имаш някаква чексума в твоя протокол, ползвай я да провериш дали си на вярната скорост след ауто-детекта.
Ако нямаш, ... - оправи си протокола преди да правиш автоматичен бод рейт (добави чек сума).
|
| Чет Юни 17, 2010 11:29 am |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
 |  |  |  | gicho написа: Казваш, че не е известно какви ще са байтовете по шината - не е ли дефиниран някакъв протокол, поне формат на хедъра? Ако се ползва NRZ кодиране, е малко проблемно да се измисли нещо универсално. Единият вариант е да опиташ да хванеш bit time - да следиш за разстоянието между фронтовете, като запомняш минималното време. Само че трябва да следиш известно време, за да си сигурен че е минал единичен бит (0 или 1) - ако се предават примерно двоично 000011110000111100001111, няма да се получи - трябва да е гарантирано , че данните съдържат единичен бит (010 или 101) за периода на самонастройката. Като хванеш бит тайма, лесно обръщаш в baud ratе, инициализираш контролера и почваш да получаваш. Естествено, ще трябва да намериш вярната скорост от списъка с възможните - може да си измерил 106us време за бит (т.е. 9430 bps), ама явно ще да е 9600 истинската.
Като пример, има нещо подобно в някой CAN контролери, но там си има гаранция за идването на единичен бит, и отделно лесно може да се провери дали съобщението е прието на правилния baud rate по CRC-то на фрейма.
Ако имаш някаква чексума в твоя протокол, ползвай я да провериш дали си на вярната скорост след ауто-детекта.
Ако нямаш, ... - оправи си протокола преди да правиш автоматичен бод рейт (добави чек сума). |  |  |  |  |
Да имам дефиниран протокол. Има си CRC16, но неми се иска да обвързвам дедектването на скоростта със конкретния протокол иска ми се да измисля някакво по универсално решение което може и да се прилага наготово и в други подобни системи.
Тоест предпочитам решението да е обвързано само с физическия слой от OSI модела тоест със средата RS485. Да знам че това доста усложнява нещата но пък иначе решението си е тривиално и няма какво толкова да му се мисли и обсъжда. Варианта с единичният байт е ясен, проблема там е какъв критерий за това че вече е хванат единичен байт да се приложи.
Благодаря за отговора.
|
| Чет Юни 17, 2010 4:16 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
А защо се налага да работиш с различни скорости? В една система, която е разработена и функционира в реални условия не е добра идея зорлен да се пъхат фактори, които могат да попречат на комуникацията. При такава система се избира оптималната скорост и се работи само с нея - така няма занимавки с простотии.
Единствения случай за който се сещам, че е НУЖНО да се открива автоматично скоростта е да се подслушва някакъв трафик - примерно шпионаж или дебъгинг. При твоя случай кое от двете е?
_________________ Digitally yours: Optron
|
| Чет Юни 17, 2010 6:22 pm |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
Не смятам че да се направи едно устройство по гъвкаво е простотия. Да разбира се изглежда много по лесно да кажем конфигурирай си UARTA на определена скорост и си работи така, но не смятам че е не възможно това конфигуриране да се автоматизира.
Колкото до вкарването на проблеми то зависи дали ще си го направя достатъчно свястно или не. А защо е точно необходимо представи си следния случай имаш примерно 16 устройства вързани на една магистрала някои от който заврени на майната си примерно се налага да се смени устройство колко по лесно било просто подменяш свързваш и новото устройство се само конфигурира.
Другия вариант е сега тва устройство на каква ли скорост е настроено а тази bus на каква ли скорост е да се пренастройва гадна история, още повече може да се
наложи подмяната да се извърши от хора които не са много наясно. Ако настройката е автоматична всичко опира само до правилно подвързване което не е кои знае каква философия и за обикновен ел. техник.
А за самото тестване на системата (примерно за определяне на спомената оптимална скорост) да не говорим какво удобство е едно е да промениш скоростта на едно мастер устройство и всички подчинени да се само настроят а не да се вреш до всяко едно сумати пъти.
Както и да е предпочитам да коментираме проблема по същество а не защо е необходимо колко е без мислено да се прави и тем подобни. Все пак въпроса беше за това как може да се реализира нека да не се отклоняваме от него.
|
| Чет Юни 17, 2010 10:23 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
интерено ми е какво се предава по рс-а. за да можеш да си позволиш да "изтърваш" информация докато си настроиш скоростта. тия сериили протоколи тожа им е гадното, особето тия дето нямат клок шина. и пак както каза някой, скоростите са стандартни, ще имаш донаместване след измерването на времената, и без црц ще ти е мн трудно
|
| Пет Юни 18, 2010 10:34 am |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
Процеса на само настройка се изпълнява само след рестартиране на устройството веднъж определена скоростта нататък се използва без да се следи. Процеса на настройка ще е относително кратък дали устройството започва да комуникира веднага или няколко десетки секунди след включването не е никакъв проблем. Точно това че скоростите са стандартни прави комуникацията възможна.
|
| Пет Юни 18, 2010 10:46 am |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Добрем. Самонастройка да бъде.
Обичайно, самонастройващи се устройства си приказват разни неща, които знаят предварително и се настройват, докато получат верни данни. При някои случай правят и измервания - телефонните модеми например.
Ако протоколът е твой, тогава постави във всеки пакет един контролен хедър, който да се знае от всички устройства. Новосвързано устройство пробва да слуша на всички скорости, които умее, докато чуе този хедър.
Друг вариант е, след като имаш мастер, то той да слуша на две скорости - тази, на която работи в момента, и една, която е известна на всички, най-добре най-бавната. Ново подчинено устройство праща запитване на известната скорост и мастерът му отговаря на каква скорост да се настрои. Ако няма възможност мастерът да слуша на две скорости едновременно, тогава подчиненото пробва да праща запитване на всяка от скоростите, които владее, докато получи отговор от мастера. Тук мастерът трябва да изпраща команда до всички подчинени за смяна на скоростта когато ти решиш да настроиш друга скорост.
Трети вариант е преди предаване на данни да се пуска т.нар. preamble (не знам как е на български) - това е контролен сигнал, обикновено поредица от редуващи се 0 и 1, с цел приемникът да прихване основните параметри на сигнала и от тях да си изчисли скоростта. Този преамбъл е фиксиран и предварително известен на всички устройства и се излъчва задължително преди всяко предаване на данни. Този метод обичайно се ползва при радио-комуникации.
Други начини не се сещам. Това да се самонастрои при напълно неизвестни данни, и то при асинхронна комуникация може да стане само на късмет. Трябва непременно да имаш някакъв контрол за вярност на данните.
_________________ Digitally yours: Optron
|
| Пет Юни 18, 2010 8:19 pm |
|
 |
|
todorov8001
Ранг: Минаващ
Регистриран на: Нед Юли 24, 2005 3:35 pm Мнения: 62 Местоположение: Стара Загора
|
Благодаря за отговора и предложените варианти.
Да стандартно е така самонастройващи се устройства си приказват разни неща, които знаят предварително и се настройват, докато получат верни данни това е възможно най лесния за реализиране подход,но аз искам да реализирам подход чрез измерване на параметри но без да са точно известни данните не казвам че това е лесно осъществимо, но пак и не смятам те е невъзможно. Cмятам че това може да се постигне защото самия стандарт за RS485 поставя доста рамки на които може да се стъпи, не става дума за откриване на скоростта на произволна асинхронна комуникация между устройства при неизвестни данни то това е от ясно по-ясно че е невъзможно.
Ето нещата на базата на които може да се стъпи според мен:
1. Скоростите на комуникация са дефинирани от стандарта максималните отклонения от тях също са дефинирани.
2. Данните се изпра6тат на думи като всяка дума започва със стартов бит и завършва със стоп бит думата сдържа фиксирам брои битове.
3. Съществува вероятност за грешка, но проблема с тази грешка се разрешава на по горно ниво. При грешно определена скорост са възможни два варианта не се приемат никакви данни или се приемат некоректни данни. Ако не се приемат никакви данни определен интервал от време устройството се рестартира и съответно процеса на самонастройка се повтаря. Варианта с грешните данни се свежда до първият тъй като самия протокол за комуникация си проверява достоверността на получените данни и недостоверните се игнорират тоест все едно не са приети.
4. По време на самонастройка процесора е напълно свободен и може да се занимава само с нея. Ясно е че ако се използва само UARTА ако данните са неизвестни няма как да се налучка скоростта. Затова при самонастройка няма да се използва той а директно ще се следят фронтове и импулсите ще се измерва продължителността на импулсите данните от измерванията ще се запазват в RАМ като таблици и след като се достигне определено количество данни ще бъдат подложени на статистическа обработка преди да бъде определена скоростта от тях.
Като казах алгоритъм имах в предвид нещо подобно не налучкване на скоростта до установяване на успешна комуникация.
|
| Съб Юни 19, 2010 3:57 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Щом протоколът си проверява достоверността, тогава нещата се улесняват много - процесът се свежда до простичко обхождане на всички налични скорости, докато протоколът вдигне флаг за верни данни. Малко измерване какъв процент от приетите данни са верни от общото количество приети и ако тоя процент покрива определена граница, значи това е скоростта и устройството започва да работи с нея. Иначе се преминава нататък в списъка със скоростите. Границата за приемлива достоверност се преценя според средата - дали е тиха или шумна.
_________________ Digitally yours: Optron
|
| Нед Юни 20, 2010 12:44 am |
|
 |
|
forest_gump
Ранг: Професионалист
Регистриран на: Сря Окт 13, 2004 11:24 pm Мнения: 500 Местоположение: Стара Загора
|
за мен колегата gicho ти е подсказал отговора, да ползваш бита по четност като критерий дали си на вярната скорост. Сменаш скоростите до момента когато проверката по четност не се задържи за всеки приет байт. Друг е въпроса дали предавателя ти е с активиран бит за контрол по четност!
|
| Пет Юни 25, 2010 9:52 pm |
|
|
|
Страница 1 от 1
|
[ 11 мнения ] |
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|