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

EEPROM błędny odczyt [avr][atmega128][c][winavr]

AVRowiec 07 Sty 2010 05:45 1778 3
  • #1 7497607
    AVRowiec
    Poziom 18  
    Mam dziwny kłopot.
    Napisałem dwie proste funkcje:
    void SaveString(char offset, unsigned char * tekst)
    {
    
      for(char i=0; i<strlen(tekst); i++)
        EEPROM_write(offset+i, tekst[i]);
      
       
      EEPROM_write(i, 0);
    }
    //////////////////////////////////////
    unsigned char * OpenString(unsigned char offset)
    {  
    unsigned char  temp[15],i=0;
    for (char i=0; i<15; i++);//teoretycznie niepotrzebne
    i=0;
    
    while ((temp[i]!=0) && (i<12))
    {
       temp[i]=EEPROM_read(offset+i);
       i++;
    }
       temp[i]=0;//teoretycznie niepotrzebne
       
     return temp;
    }


    w Mainie:
    
    SaveString(10,"kosmita");
    K(OpenString(10));
    Send(OpenString(10));


    K() - wyrzuca na ekran - pojawia się napis "kosmita"+jakieś krzaki

    Send() - wysyła przez uart za pomocą standardowych procedur z datasheeta.

    Funkcje EEPROM read i write też są z datasheeta.

    Czy ktoś jest w stanie wytułmaczyć mi te krzaki na terminalu?:

    999999999999999999999999999999999999999
    999999999999999999999999999999999999999
    99999999kosmita˙˙˙˙˙˙˙˙x999999999
    99999999999999999999999999999999999999
    999999999999999999999999999999999999999
    999999999999999999999999999999999999999
    99999999999999999999

    I ten syf na lcd ?!

    Dodam że jak próbuje odczytać jeden znak to działa wszystko ok.

    Wiem że funkcje są zapisane pokracznie i mogą być krótsze (używając wskaźników) ale postanowiłem zastosować najprostszą wersje.

    Mam nadzieje że ktoś mi pomoże bo coś mnie już strzelać zaczyna...
  • #3 7498918
    AVRowiec
    Poziom 18  
    main.c: In function 'SaveString':
    main.c:1264: warning: pointer targets in passing argument 1 of 'strlen' differ in signedness
    main.c:1265: warning: array subscript has type 'char'
    main.c: In function 'OpenString':
    main.c:1284: warning: function returns address of local variable

    Miałeś racje zumek. Tylko dlaczego to jest problem? Zwykle tak zwracałem łańcuszki i nie było kłopotów. Dać static czy co?!
    Usunąłem treść niezwiązaną z tematem.
    [zumek]


    Dodano po 39 [minuty]:

    szukam i szukam na temat zwracania wartości zmiennej lokalnej i znaleźć nie mogę.. Czy ktoś wie jak to bezpiecznie zrobić?
  • #4 7499637
    tmf
    VIP Zasłużony dla elektroda
    Bo to jest zmienna tworzona tylko na chwile, automatycznie niszczona w momencie wyjscia z funkcji (out of scope). Wiec wskaznik, ktory zwracasz juz nie wskazuje na poprawny obszar danych. Dlatego mozesz ta zmienna zadeklarowac jako globalna (tylko po co wtedy zwracac jej adres), dac static, ale to tez bez sensu, bo dla kolejnych wywolan funkcji bedziesz nadpisywal ta sama zmienna, albo alokowac pamiec dla tej zmiennej dynamicznie za pomoca malloc i zwracac wskaznik. Tyle, ze w tym wypadku musisz pamietac, zeby ta pamiec zwolnic, kiedy zmienna juz nie bedzie potrzebna, przez free.
    A kolejne rozwiazanie to w twojej funkcji dodac kolejny parametr - wskaznik na bufor do ktorego maja byc zaladowane dane, dzieki czemu fiunkcja bedzie operowac na tym buforze, a nie zmiennych lokalnych.
REKLAMA