logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[LPC-2138] [LPC-2138][CrossWorks] Jak wydobyć liczby z formatu UART1 za pomocą wskaźników?

borsukh 29 Lis 2008 03:17 1454 2
REKLAMA
  • #1 5795859
    borsukh
    Poziom 11  
    Posty: 22
    Witam koledzy, po raz kolejny potrzebuję waszej pomocy. Przejdę od razu do rzeczy. Do portu UART1 mam podłączone urządzenie, które wysyła informacje w następującym formacie:

    $C299.2P2.2R93.3T23.1*1C

    Potrzebuję z niej wydobyć 3 liczby następujące po literach C, P oraz R. Liczby te mogą być ujemne bądź dodatnie, znam ich maksymalną wartość.
    Długo wzbraniałem się przed używaniem wskaźników, no ale w tym przypadku było to wyjście najrozsądniejsze. Poniżej kod obsługi przerwania wywołanego przez przyjście znaku na UART1:

    
    static unsigned char UART1char, heading[6],pitch[6],roll[7],*valuepick = NULL;
    static double headingval, pitchval, rollval;
    
    UART1char = U1RBR;
    
    switch (UART1char)
                    {
                      case 'C': valuepick = &heading;   \\wskaznik na heading
                                    break;
                      case 'P': *valuepick = '\0';           \\wstaw '\0' do heading
                                   valuepick = &pitch;        \\ wskaznik na pitch
                                   break;
                      case 'R': *valuepick = '\0';           \\wstaw '\0' do pitch
                                   valuepick = &roll;           \\wskaznik na roll
                                   break;
                      case 'T': *valuepick = '\0';           \\wstaw '\0' do roll
                                   headingval = atof(&heading);     \\zamien string na double
                                   pitchval = atof(&pitch);  
                                   rollval = atof(&roll);
                                   valuepick = NULL;
                                   break;
                      default:  *valuepick = UART1char; \\wstaw cyfre do aktualnego wskazania wskaznika
                                   valuepick++;  \\przesun wskaznik na nastepna komorke stringa
                                   break;
                    }


    Jak dla mnie kod wydaje się prosty i nie widzę gdzie tu może występować błąd. Jednak moje próby debugowania przez wstawianie printf do poszczególnych case wskazują że problemem jest pierwsza linijka default, mianowicie:

    *valuepick = UART1char;

    Jak ją skomentuję to program"działa", to znaczy otrzymuje dane z powstawianych printfów, czyli program wchodzi do poszczególnych casów. Natomiast kiedy jest nieskomentowana, wejście do default powoduje zawieszenie. Nie wiem co jest nie tak, proste przekazanie wartości do miejsca wskazanego przez pointer. Nie wykluczam, że pewnie gdzieś są inne błędy, ale nie mogę ich znaleźć póki tego nie rozwiąże. Bez tej linijki program nie będzie działał poprawnie. Proszę was zatem o pomoc.
  • REKLAMA
  • Pomocny post
    #2 5796342
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    pierwszy znak jaki dostajesz z UARTa to '$', poniewaz nie ma warunku na ten konkretny znak to wywoluje sie warunek default. poniewaz jest to pierwszy znak to wskaznik ma wartosc 0. zapisujesz ten znak pod adres zero. operacja ta konczy sie natychmiastowym krytycznym wyjatkiem jadra, poniewaz zapis flasha (adres 0) przez kod programu nie jest mozliwy.

    tak w ogole to skoro uzywasz fnkcji bibliotecznych, to badz swiadom faktu, ze w bibliotece string.h sa funkcje ktore robia to co ty robisz tym switchem. wystarczyloby odebrac caly ciag znakow a nastepnie potraktorac go odpowiednimi funkcjami aby wyszukac konkretne znaki.

    pozatym jeszcze skoro widze tutaj 1 miejsce po przecinku to po co ci double? zreszta tak czy siak atof konwertuje do typu FLOAT (zgodnie z nazwa - array to float a nie array to double, bo atod() tez jest).

    4\/3!!
  • #3 5797754
    borsukh
    Poziom 11  
    Posty: 22
    Bezsensowne niedopatrzenie... Ale właśnie za to lubię to forum, że mi oszczędza frustracji. Dzięki Freddie. Btw atof() według helpa z CrossWorks zwraca właśnie double stąd tak to napisałem.
REKLAMA