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

Zapis stringa do EEPROM i wysłanie na UART po odebraniu TEST

tanczacy_z_linkami 12 Sie 2015 13:15 2856 31
REKLAMA
  • #1 14916221
    tanczacy_z_linkami
    Poziom 11  
    Witam :)

    efekt ma być taki że odbiorze stringa "TEST" powinna zostać przesłana na uart zawartość eeprom
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    [/code]


    Gdzie mogę robić błąd

    LED gaśnie wysłaniu na UART "TEST"

    pytania ....
    czy zawartość(tekst) tokena jest poprawnie zapisana do eeprom

    jeśli nie to jak ma być?

    jak wysłać zapisaną wartość (tekst) w eeprom na uart ?

    co poprawić ?



    Nie czy to ma znaczenie ale korzystam z ATMEL STUDIO ?
  • REKLAMA
  • #2 14916246
    szczywronek
    Poziom 28  
    tanczacy_z_linkami napisał:
    co poprawić ?
    Jasność wypowiedzi i pisownię.

    Funkcja uart_puts() jest przystosowana do odczytywania danych z eepromu?

    (dopisane po zmianie pierwszego postu przez Autora)

    Cytat:
    czy zawartość(tekst) tokena jest poprawnie zapisana do eeprom
    Jeśli "zapis do eeprom" to ta linijka:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to nie jest poprawnie. Masz (prawie) zdefiniowane dwie funkcje do zapisywania danych RAM->EEPROM i odczytywania EEPROM->RAM - z nich powinieneś skorzystać.

    Swoją drogą (jeżeli to jest cały program) to użycie struktury jest zbędne i tylko komplikuje kod, który i tak jest strasznie pokręcony.
    Z tego co rozumiem: z uartu coś tam odbierasz i zapisujesz w globalnym buforze "buf". Potem wyłuskujesz z tego jakieś informacje w funkcji "analizuj dane". I na końcu chciałbyś zapisać string z pod wskaźnika "wsk" do eepromu, zgadza się? Użyj funkcji copy_ram_emm i skopiuj z dane *wsk do *eem_buf.

    Cytat:
    jak wysłać zapisaną wartość (tekst) w eeprom na uart ?
    Przypuszczam, że funkcja uart_puts przyjmuje dane z pamięci RAM. Odczytaj więc swój string z EEPROMu do RAMu (funkcja copy_emm_ram) i jako argument funkcji podaj bufor w RAMie.
  • #3 14916431
    tanczacy_z_linkami
    Poziom 11  
    to chyba ktoś mnie troszkę w maliny wprowadził

    od początku

    Co muszę zrobić aby zapisać "token-string" wsk do eeprom lub ram
    oraz jak sprawdzic czy faktycznie został zapisany ?

    potrzebuje pózniej przesłac zawartość wsk na uart'
    piszę ram dlatego że nie potrzebuje miec na stałe tych danych


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 14916518
    szczywronek
    Poziom 28  
    tanczacy_z_linkami napisał:
    to chyba ktoś mnie troszkę w maliny wprowadził
    Nie bardzo wiadomo do czego zmierzasz z tym programem, więc możliwe, że teraz w maliny wprowadzam Cię ja ;)

    tanczacy_z_linkami napisał:
    Co muszę zrobić aby zapisać "token-string" wsk do eeprom lub ram
    Do RAM - nic. Twój bufor (tablica buf) jest już przecież w pamięci RAM.
    EEPROM to pamięć która zachowuje zawartość po zaniku zasilania. Nie wiem co rozumiesz przez "nie potrzebuje miec na stałe tych danych", ale może wcale nie potrzebujesz zapisywać do eepromu?

    Tak czy siak, zapis do eeprom:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeśli chcesz tylko odesłać string z "wsk" przez UART to wystarczy (nie pokazałeś funkcji uart_puts, zakładam że przyjmuje wskaźnik na string):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 14916539
    tanczacy_z_linkami
    Poziom 11  
    szczywronek napisał:
    tanczacy_z_linkami napisał:
    to chyba ktoś mnie troszkę w maliny wprowadził
    Nie bardzo wiadomo do czego zmierzasz z tym programem, więc możliwe, że teraz w maliny wprowadzam Cię ja ;)

    tanczacy_z_linkami napisał:
    Co muszę zrobić aby zapisać "token-string" wsk do eeprom lub ram
    Do RAM - nic. Twój bufor (tablica buf) jest już przecież w pamięci RAM.
    EEPROM to pamięć która zachowuje zawartość po zaniku zasilania. Nie wiem co rozumiesz przez "nie potrzebuje miec na stałe tych danych", ale może wcale nie potrzebujesz zapisywać do eepromu?

    Tak czy siak, zapis do eeprom:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jeśli chcesz tylko odesłać string z "wsk" przez UART to wystarczy (nie pokazałeś funkcji uart_puts, zakładam że przyjmuje wskaźnik na string):
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    może ciut zamotałem

    ale jest tak ze chciałbym odesłać zawartość wsk (jeśli zawiera co było w tokenie ) na uart i udaje mi się to jedynie tylko w tej petli w której go uzyskuje

    (tam gdzie jest token i wsk z jego zawartością ) a nie moge odesłac zawartosci wsk w innej funkcji .Mam nadziej że udało mi się wyjasnic ?
  • REKLAMA
  • Pomocny post
    #6 14916954
    szczywronek
    Poziom 28  
    tanczacy_z_linkami napisał:
    udaje mi się to jedynie tylko w tej petli w której go uzyskuje (tam gdzie jest token i wsk z jego zawartością ) a nie moge odesłac zawartosci wsk w innej funkcji
    Jakiej pętli? Chodzi Ci o funkcję "analizuj_dane_id"?

    Niestety, ale bez znajomości podstaw języka C daleko nie zajdziesz... albo będzie Cię to kosztowało sporo nerwów ;) "wsk" jest wskaźnikiem czyli adresem na coś w pamięci. Sam z siebie nie ma "zawartości". Dodatkowo "wsk" u Ciebie jest obiektem lokalnym. Jest automatycznie tworzony przy wejściu do funkcji, dostępny w niej i tylko w niej i przepada po wyjściu z funkcji.

    Jeśli chcesz skopiować string z pod wskaźnika "wsk" tak, aby był dostępny globalnie, to: stwórz globalną tablicę znaków na ten string i w funkcji analizuj_dane_id skopiuj ten string. Np za pomocą funkcji strcpy:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 14916955
    tanczacy_z_linkami
    Poziom 11  
    jest postęp :)
    zapisywanie już działa ale



    Szukam sposobu na zabezpieczenie w eeprom

    Mam taką sytuację
    dane zapisuje za pomocą takiej funkcji

    eeprom_write_block(wsk, eem_buf, strlen(wsk));

    i teraz jeśli zapisze np. 123456789ABCD
    odczytam 123456789ABCD

    następnym razem zapiszę 987654321
    to w pamięci odczytuje

    987654321ABCD

    czyli zostają stare z poprzedniego zapisu

    jak się ich pozbyć tak aby kolejny zapis był bez poprzednich danych jeśli jest ich więcej niż aktualnie zapisanych?
  • Pomocny post
    #8 14917720
    szczywronek
    Poziom 28  
    Te dane to zawsze będą stringi? Jeśli tak to przerób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Dzięki temu zapisywany będzie też znak końca stringu.

    Pokaż jak odczytujesz dane z eepromu.
  • #9 14917764
    tanczacy_z_linkami
    Poziom 11  
    szczywronek napisał:
    Te dane to zawsze będą stringi? Jeśli tak to przerób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    na:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Dzięki temu zapisywany będzie też znak końca stringu.

    Pokaż jak odczytujesz dane z eepromu.


    Jeszcze nie potrafię odczytywać programowo :(

    aktualnie sprawdzam co się zapisało w programatorze odczytując pamięć

    Jak ogarnę to "zabezpieczenie"

    Wezmę się za odczyt i przesłanie na Uart

    ew jakbyś dał mi podpowiedział jak zacząć ?
  • #10 14918221
    szczywronek
    Poziom 28  
    Odczytuj za pomocą eeprom_read_block. Przykład:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    String w EEPROM musi być zapisany ze znakiem końca (patrz mój poprzedni post). Bufor musi być dłuższy niż najdłuższy z możliwych stringów (+1B na znak końca stringu). Po odczycie, w buforze w RAMie, będziesz miał odczytany string (ze znakiem końca) i ewentualnie jakieś śmieci (poprzednio zapisane dane). Te śmieci w niczym nie przeszkadzają bo będą za znakiem końca stringu. Funkcja wysyłające string przez uart - uart_puts() - powinna rozpoznawać znak końca stringu i dalej nie odczytywać danych ;)
  • #11 14918303
    tanczacy_z_linkami
    Poziom 11  
    Zapis z zabezpieczeniem działa :)

    Zapis stringa do EEPROM i wysłanie na UART po odebraniu TEST

    Dodano po 38 [minuty]:

    kopiowanie wsk do tablicy globalnej nie wyszło
    ew źle go wysyłam na uart

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Wysłanie "TEST" działa bo gaśnie LED
    ale nie wysyła zawartości wsk na UART
    Co może być powodem ?
  • #13 14920929
    tanczacy_z_linkami
    Poziom 11  
    Uart działa poprawnie
  • #15 14929578
    tanczacy_z_linkami
    Poziom 11  
    Wrzucam całość
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co muszę wiedzieć aby zapisany w pamięci EEPROM (token- string zakończony zerem) wysłać na UART zaraz po tym jak przyjdzie string "TEST" .

    Inaczej wysyłam TEST a procesor ma odpowiedzieć na UART co ma aktualnie w pamięci EEPROM - wysłać string

    String "TEST" działa poprawnie bo jak go wyśle gaśnie LED działa tez
    uart_puts(proba);

    Jak by ktoś zechciał wyłożyć trochę teorii na jakimś przykładzie
  • #17 14930502
    szczywronek
    Poziom 28  
    Zauważ, że gdy wyślesz "TEST" to:
    1. funkcja "analizuj_dane_id" w buforze "buf" dostaje odebrane dane z uartu - czyli słowo "TEST"
    2. funkcja "strtok" nie znajduje w buforze (w słowie "TEST") znaków rozdzielających słowa/tokeny (+ lub "), więc zwraca NULL
    3. "eeprom_write_block" nie ma sensu bo wartość "wsk" jest równa NULL
    4. kopiowanie do tablicy globalnej też nie ma sensu z powyższego powodu

    Kopiowanie do eepromu i do zmiennej globalnej powinno następować tylko jeśli "wsk" będzie prawidłowym wskaźnikiem na ciąg znaków. Na szybko proponuję coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A! I wysyłaj uartem "globalną_tablicę" a nie "wsk" ;)
  • REKLAMA
  • #18 14930884
    tanczacy_z_linkami
    Poziom 11  
    a weźmy taki przypadek

    1. Wyślę "1+123456789"
    w eepromie jest wtedy zapisane "123456789" czyli to co mnie interesuje
    i nie zmieni się do chwili kiedy znowu nie dostanie x+xxxxxx czyli wyłuska tokena

    2. Słowo "TEST" ma wywołać funkcję która powinna odesłać zawartość eeproma
    na uart.

    3. Czy taka sytuacja jest możliwa ?
  • #20 14934349
    tanczacy_z_linkami
    Poziom 11  
    Właśnie sprawdziłem Twoją propozycje i niestety efekt jest taki sam jak wcześniej :(

    (tj. do epromu zapisuje się co trzeba zmieniłem także słowo "TEST" na zawartość tokena tak aby wartość wsk nie była NULL niestety bez sukcesu)

    Może spróbujemy jak w poprzednim poście

    "2. Słowo "TEST" ma wywołać funkcję która powinna odesłać zawartość eeproma
    na uart"

    jak to ogarnąć ?
  • Pomocny post
    #21 14934532
    szczywronek
    Poziom 28  
    Heh... a mnie działa ;)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Terminal (komendy poprzedzone znakiem '>'), dane wysyłane uartem pozwoliłem sobie wziąć z innego z Twoich tematów:
    Start programu!
    >TEST
    Funkcja test: 
    >TEST
    Funkcja test: 
    >+CMT:"+1234567890",,"15/08/02,15:56:34+03"
    Wykryto token: #1234567890#
    >TEST
    Funkcja test: 1234567890
    >TEST
    Funkcja test: 1234567890
    >+CMT:"+111222333",,"15/08/02,15:56:34+03"
    Wykryto token: #111222333#
    >TEST
    Funkcja test: 111222333
    >TEST
    Funkcja test: 111222333
  • #22 14934764
    tanczacy_z_linkami
    Poziom 11  
    ale mnie teraz zaskoczyłeś :)
    zaraz muszę to sprawdzić !

    jest progres :) narazie tyle




    nkcja test: ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙—©Ř˘9-•{ţŻ…ź—Óĺľo)ä]_ö]ŚFTĽ”Iěçi1s[Îoľ“ŐěŔ6űß?Ţ;}IÓ1ć< »6˙gx Áz›©l~ć+wĺÇWńW0ë©·™˛­BąćÔČ?ß/Ř9×ěJ+µ˙dűë˙›Ľ­Ýńi=čŹýQ^>ó÷q©ęéó$˘gúÔŻ^=\ůţxPżÚj*öŐ©ăń!ô®…ă?}spĺOťs®Űü&jjü߇_7@§ź˛^řÎ神cçjÁ3jćŮ}ĆrěořŠżň+ď˝÷ ^}_ąŃŔÓú•Ă˙Ę–Kn»­ëű5·˝m3uŽqóŻď~uZV–é÷Č—ä»ëţ¶Bd
  • #23 14943880
    tanczacy_z_linkami
    Poziom 11  
    Udało sie :)
    Problem był spowodowany zle ustawionym kwarcu bo w kodzie
    teraz jest tak jak na obrazku Zapis stringa do EEPROM i wysłanie na UART po odebraniu TEST


    i gra :)
  • #24 15560424
    tanczacy_z_linkami
    Poziom 11  
    Witam,
    Postanowiłem troszkę rozbudować program
    jednak napotakałem na błąd możecie zerknąć co może być powodem

    1. odczytuje dane z uart i zapisuje je do tablicy
    kod
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i tu jest OK :)

    teraz chciałbym sprawdzić czy to co nadlatuje na uart jest zgodne z tym co jest w tablicy

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Program się kompliuje bez błędu a a funkcja zapal_led nie działa?
    [/syntax]
    z góry dzięki za podpowiedz
  • #25 15561365
    BlueDraco
    Specjalista - Mikrokontrolery
    To:
    if (!strcmp(buf, "globalna_tablica"))

    Oznacza: jeśli łańcuch tekstowy w buf jest równy napisowi o treści "globalna_tablica".

    (Poprawka, nie zauważyłem wykrzyknika, co jak zwykle uprzejmie i sympatycznie zauważył kol. GrzegorzKostka poniżej.)

    Proponuję zacząć od nauki podstaw języka C. Do nauki na tym poziomie wygodniejszy jest PeCet niż mikrokontroler.
  • #26 15561638
    grko
    Poziom 33  
    Cytat:

    To:
    if (!strcmp(buf, "globalna_tablica"))

    Oznacza: jeśli łańcuch tekstowy w buf jest różny od napisu o treści "globalna_tablica".

    Proponuję zacząć od nauki podstaw języka C. Do nauki na tym poziomie wygodniejszy jest PeCet niż mikrokontroler.


    @BlueDraco
    Ja proponuje Tobie zapoznać się podstawowymi funkcjami biblioteki standardowej. Może tu uchroni Cię przed pisaniem takich postów.

    http://www.cplusplus.com/reference/cstring/strcmp/

    (Uprzejmości i sympatycznośći nauczyłem się na tym forum od najlepszych ;) )
  • #27 15562133
    tanczacy_z_linkami
    Poziom 11  
    Dziękuje kolegom za szybkie podpowiedzi

    Macie rację tam nie powinno być "" bo to oznaczało by tekst
    a ja chciał bym porównać to co znajduje się w buforze z tym co znajduje się w tablicy niestety nie wiem jak?
    funkcja strcmp jakby nie widziała tablicy

    i teraz pytanie czy strcmp może porównać bufor z tablicą czy tą tablicę należy jakoś przekonwertowac ?
  • #28 15562424
    grko
    Poziom 33  
    @tanczacy_z_linkami

    No to użyj strcmp tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oba symbole muszą być zadeklarowane przed tym wywołaniem (podejrzewam, że z tym masz problem).
  • #30 15562513
    tanczacy_z_linkami
    Poziom 11  
    GrzegorzKostka napisał:
    @tanczacy_z_linkami

    No to użyj strcmp tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oba symbole muszą być zadeklarowane przed tym wywołaniem (podejrzewam, że z tym masz problem).



    Właśnie tak używam i nici
    co do deklaracji mam je przed pętlą
    int main (void)
    tj.
    char uart_buf[50];
    char globalna_tablica[40];
REKLAMA