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.

Atmega32 - [C] UART- czyli odbieranie string'a

mlynarz96 02 Lis 2012 00:09 1536 8
  • #1 02 Lis 2012 00:09
    mlynarz96
    Poziom 9  

    Witam.
    Otóż przeszukałem chyba każde miejsce na forum na temat odbierania ciągu znaków przez UART w C. Znalazłem jedynie o wysyłaniu pojedynczych znaków jak i całych ciągów, a o odbieraniu jest tylko o znaku. Wymyśliłem więc że każdy odebrany znak zapiszę do tablicy i zwrócę jej wartość w funkcji gdy dojdzie do znaku enter (\n). Ale niestety coś się przekombinowałem i nie działa. Oto jej kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    A oto fragment kodu z main.c:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Odpowiedź przyda zarówno mi jak i wielu innym osobom z podobnym kłopotem.

    0 8
  • #2 02 Lis 2012 00:35
    Raphaw
    Poziom 20  

    Nie ma prawa działać. Zmienna odb jest typu char, porównujesz ją natomiast z całym stringiem i to w dziwny sposób. Funkcja uart_gets woła o pomstę do nieba, a treści uart_getc można się jedynie domyślać..

    0
  • #3 02 Lis 2012 00:51
    McMonster
    Poziom 32  

    To się w ogóle skopilowało bez błędów? Bo ostrzeżenia prawie na pewno jakieś były. Pierwsza funkcja może co najwyżej zwrócić znak końca linii i nic innego. W drugiej mieszasz cudzysłowy i apostrofy. W skrócie do napisania od zera.

    0
  • #4 02 Lis 2012 09:21
    tmf
    Moderator Mikrokontrolery Projektowanie

    Od zera, w sensie, że lepiej by to było oprzeć o przerwania. Ale nie jest aż tak źle. uart_gets nic nie musi zwracać, w końcu wiadomo, że jak wróci to mamy pełny łańcuch znajdujący się w tablicy buf, począwszy od indeksu 0. Wygodnie jest zachować konwencję C przechowywania łańcuchów, czyli ASCIZ, zamiast \n końcem ciągu lepiej, żeby był znak NULL. Wtedy porównanie można prosto zrobić funkcjami z string.h, np. strcmp.

    0
  • #5 02 Lis 2012 13:25
    mlynarz96
    Poziom 9  

    Skompilowało się bez błędu.
    To co proponujecie? Od nowa pisać? Poczytam coś o tym strcmp co pisał kolega tmf. Mam rozumieć że uart_gets mogło by być tylko źle je porównuje? Zależy mi bardzo an tej funkcji.

    0
  • #6 02 Lis 2012 13:53
    tmf
    Moderator Mikrokontrolery Projektowanie

    Oj, a po co takie skompikowane to getc? Mam wrażenie, że to pochodzi z jakiejś implementacji bufora cyklicznego. Pomieszałeś zupełnie różne koncepcje. W twoim przypadku getc powinno tylko sprawdzać czy jest znak do odebrania i go zwracać, to wszystko.

    0
  • #7 02 Lis 2012 13:58
    mlynarz96
    Poziom 9  

    Tak, w wyżej wymienionej książce autor użył bufora cyklicznego. To co w takim razie ma zwracać funkcja? w jaki sposób odebrać na przykład jakiś wyraz?

    0
  • #8 02 Lis 2012 14:02
    tmf
    Moderator Mikrokontrolery Projektowanie

    Przecież za odbiór wyrazu (tekstu do \n czy 0) odpowiada twoja funkcja uart_gets. Jedyne co musisz dodać to odczyt samego uartu, czyli getc. Ale to tylko jak pisałem sprawdzenie flagi określającej czy jest bajt do odebrania i odczyt UDR.

    0
  • #9 02 Lis 2012 14:16
    sepako
    Poziom 14  

    Odbieraj po kolei znaki do bufora w przerwaniu np ISR(USART_RXC_vect) a jak odebranym znakiem będzie umowny znak końca (moze byc enter=0x0d) dodaj na koniec zero i wróć z wskaźnikiem na początek bufora, w buforze będziesz miał prawidłowego stringa. Zabezpieczył bym się też przed ponownym nadpisaniem bufora zanim odczytasz odebrany łańcuch.

    0