Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C]Tworzenie tablicy z odebranych danych przez UART

wojtektorr 29 Sty 2013 14:23 1902 12
  • #1 29 Sty 2013 14:23
    wojtektorr
    Poziom 14  

    Witam, mam problem do rozwiązania polegający na odebraniu danych z innego kontrolera i poskładaniu ich w konkretna tablice która ma zawierać 11 bajtów:
    0 - autoincrement
    1 - 0xFE
    2,3,4,5,6 -ciąg danych
    7 - autoincrement
    8 - 0xFD
    9 - 0x01
    10 - stan wejscia

    Czy używa się do tego bufora cyklicznego czy w pętli wypelnia sie kolejno tablice? Ktoś może mi nakreślić jak to wszystko zsynchronizować? Dane wysyłane są taka funkcją:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 12
  • #2 29 Sty 2013 15:50
    BlueDraco
    Specjalista - Mikrokontrolery

    No to odbierz je też prawie taką samą (symetryczną) funkcją, albo (lepiej) napisz prosty automat do odbioru.

    Opis, który podałeś, nie zgadza się z zacytowanym programem. W opisie jest "autincrement", a w programie - bajt długości.

    0
  • #3 29 Sty 2013 16:55
    wojtektorr
    Poziom 14  

    Ramka ma wyglądać jak opisana wyżej, wartosci do niej trzeba odebrac z tej funkcji wsylajacej a autoincrement nie jest odbierany tylko liczony w funkcji odbierajacej. Nie bardzo wiem jak symetrycznie, możesz podać konkretny przykład?

    Dodano po 18 [minuty]:

    Czy piszac "symetryczna" funkcja chodzi ci o sklejanie ramki po jednym odebranym bajcie od momentu rozpoznania bajtu początku tzn. 0XFE?

    0
  • #4 29 Sty 2013 16:55
    BlueDraco
    Specjalista - Mikrokontrolery

    Np. tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niezbyt niezawodne, ale dobry punkt wyjścia. Lepszy będzie automat z timeoutami.

    0
  • #5 29 Sty 2013 16:59
    wojtektorr
    Poziom 14  

    Ok teraz rozumiem o co chodziło ci z symetryczną funkcją :) Ale funkcja musi odbierać 100% poprawne dane czy weryfikacja autoicrementu startu stopu zapewni to? Nie wiem o co chodzi z tym automatem?

    0
  • #6 29 Sty 2013 17:12
    BlueDraco
    Specjalista - Mikrokontrolery

    Jak możesz weryfikować autoinkrement, skoro go nie nadajesz?

    O co chodzi z automatem - to tema t na dłuższy tekst. zaczynasz od rozrysowania stanów urządzenia i przejść pomiędzy nimi w zależności od zdarzeń, a potem piszesz pętlę z wielkim switch w środku.

    Np. tak

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #7 29 Sty 2013 18:23
    wojtektorr
    Poziom 14  

    Hmmm no z tym automatem sobie nie poradzę ale czy do poniższej funkcji jeśli dopisze weryfikacje tzn. wyliczenie na podstawie ilości bajtów własciwych danych oraz sprawdzenie czy index sie zgadza w odpowiednim miejscu to będzie to wystarczające rozwiązanie?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #8 29 Sty 2013 18:45
    snnaap
    Poziom 25  

    Jeżeli można się wtrącić proponował bym w połączeniu z timeout'em dodał jeszcze na koniec ramki bajt sumy kontrolnej CRC.
    Wtedy wiedząc znając czas prawidłowej przerwy pomiędzy poszczególnymi bajtami możesz ustalić sobie odpowiedni timeout zerujący sumę kontrolną, jeżeli przerwa jest mniejsza niż timeout "przerzucasz" kolejne bajty do tablicy jednocześnie obliczając CRC i jeżeli ostatni bajt z tablicy = wyliczonej sumie kontrolnej znaczy że odebrałeś pełną ramkę i jest ona prawidłowa.

    Mam nadzieje że wyraziłem się jasno.

    Pozdrawiam


    Ps. bez timeout'u zaproponowanego przez BlueDraco nigdy nie będziesz wiedział który bajt jest pierwszym.

    0
  • #9 29 Sty 2013 18:52
    BlueDraco
    Specjalista - Mikrokontrolery

    Automat z timeoutem jest po to, żebyś mógł wyjść z błędów transmisji, np. z powodu przerwania połączenia albo restartu systemu.
    Twoje rozwiązanie jest tu bezradne - popatrz, co się stanie, jeśli zaczniesz odbierać w połowie ramki.

    Tak szczerze, to automat jest tu jedynym sensownym rozwiązaniem - inne pomysły to amatorszczyzna.

    Sugestię Kol. snnaap popieram - warto jakoś sprawdzać dane.
    Suma lub xor wystarczy. Kazać małemu, biednemu ATmega liczyć CRC to barbarzyństwo. ;)

    0
  • #10 29 Sty 2013 19:04
    wojtektorr
    Poziom 14  

    W połowie ramki? Przecież warunkiem do rozpoczęcia klejenia rami jest bajt 0xFE więc jeśli zacznę w połowie to po prostu nie odbierze tej połowy tylko już następną nadchodzącą. Tym bardziej że wysyłanie ramek nie będzie jedna za drugą tylko wtedy kiedy zatwierdzimy wysłanie po wprowadzeniu danych.

    0
  • #11 29 Sty 2013 19:04
    snnaap
    Poziom 25  

    E no nie róbmy z ATmega kaleki, kilka linijek kodu mu nie zaszkodzi:

    Przykład 1

    Kod: asm
    Zaloguj się, aby zobaczyć kod



    Przykład 2
    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    źródło http://www.maximintegrated.com/app-notes/index.mvp/id/27

    W szczególności jak używa się jeszcze jakiś pastylek czy innych układów 1wire.

    0
  • #12 29 Sty 2013 20:05
    wojtektorr
    Poziom 14  

    Panowie raz że Assemblera nie bardzo rozumiem a drugie to prosiłbym żeby skupić się na rozwiązaniu dla nowicjusza w przesyłaniu danych. Może jest jakiś inny sposób niż timeouty no chyba że inaczej sie tego nie robi jak tylko w ten sposób:/ Ale do tego nie mam pojęcia jak się zabrać

    0
  • #13 30 Sty 2013 19:09
    wojtektorr
    Poziom 14  

    W takim razie proszę o małą podpowiedź do odbierania ramki. Poniżej mam przerwanie które buduje mi ramkę według szablonu z początku tematu z jednym mankamentem, mianowicie na pozycji po bajcie startu wrzuca mi ilość wlasciwych danych w ramce. Jak pominąć ten bajt?

    Funkcją nadająca:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Przerwanie odbierające:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0