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.

UART - Funkcja if nie działa tak jak powinna

nelik1987 02 Paź 2015 13:53 1119 14
  • #1 02 Paź 2015 13:53
    nelik1987

    Poziom 31  

    Zacznę od tego, że programowałem już AVR w C ale tym razem chciałem pobawić sie arduino i od razu mam roblemy

    Napisałem prosty program, który odbiera dane po UART i zapisuje je do zmiennej recived_UART w zależności od tego co odebrano załączane mają być odpowiednie styczniki.

    Niestety program nigdy nie wchodzi do tego if'a niezależnie od tego co wyślę na UART. Co ciekawe jak zapiszę to tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    to wysłanie litery a czy b nie powoduje wejścia do if'a natomiast wysłanie c,d,e,f itd już skutuje prawdą w if'ie. Zielonego pojęcia nie mam dlaczego porównanie == nie działa.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 14
  • #2 02 Paź 2015 14:01
    tadzik85
    Poziom 38  

    "c" to co innego niż 'c'

    -1
  • #3 02 Paź 2015 14:38
    zagwizdow
    Poziom 17  

    Jaką zmienna jest recived_UART ?

    0
  • #4 02 Paź 2015 14:47
    nelik1987

    Poziom 31  

    String bo będzie to później słowo na przykład SETUP

    0
  • #6 03 Paź 2015 07:42
    nelik1987

    Poziom 31  

    Znalazłem rozwiązanie, ale pośrednie, jak wyłączy się w serial monitorze opcje NL i CR to wtedy wszystko jest OK, mikrokontroler reaguje na wysłanie komendy i przy porównaniu w IF działa prawidłowo. Dziwi mnie to ponieważ zapisałem

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Czyli odczytanie do znaku nowej linii, wydaje się jak by ten zapis nie działa

    0
  • #7 03 Paź 2015 08:38
    BlueDraco
    Specjalista - Mikrokontrolery

    Po prostu musisz wiedzieć, co naprawdę wysyłasz do swojego urządzenia. Domyślnie skonfigurowany terminal po wciśnięciu Enter wysyła kod CR, czyli '\r' i zapewne tego znaku powinieneś szukać w łańcucho odebranym. Tak skonfigurowany terminal nie wysyła '\n'.

    0
  • #8 03 Paź 2015 08:57
    nelik1987

    Poziom 31  

    Zauważyłem, że jeżeli zapiszę recived_UART = Serial.readStringUntil('\n'); i ustawie w serial monitorze NL to wtedy program odpowiada natychmiast, natomiast gdy istawię brak CL i NL to program ma chwilowe opóźnienie, być może czeka na zakończenie wypełniania bufora danych skoro nie znalazł \n i dlatego jest chwila opóźnienia

    0
  • Pomocny post
    #9 03 Paź 2015 13:55
    Andrzej__S
    Poziom 28  

    Nie napisaleś, jakiego terminala używasz, więc trudno się jednoznacznie wypowiedzieć. Podejrzewam, że przy zaznaczonej opcji (jak to nazwałeś) "NL i CR" terminal po wpisaniu "c" wysyła tak naprawdę "c\r\n". Jeśli teraz czytasz w programie ciąg znaków do wystąpienia '\n', to odczytany ciąg będzie zawierał "c\r". Jeśli to porównasz z oczekiwanym "c":

    Code:
    if ("c\r" == "c")
    to wynik będzie nieprawdą.

    Jeśli tak jest, jak napisałem, to można spróbować zrobić jedną z trzech rzeczy:

    1. Porównuj odebrany ciąg z oczekiwanym w ten sposób:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    2. Ustaw terminal tak, aby wysyłał samo '\n' na końcu (jak już chyba próbowałeś).

    3. Ustaw terminal tak, aby wysyłał samo '\r' na końcu i odczytuj wtedy do wystąpienia '\r':
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie wiem, jakie są możliwości konfiguracyjne Twojego terminala, więc nie podpowiem czy i jak można to zrobić.

    0
  • #10 03 Paź 2015 14:06
    nelik1987

    Poziom 31  

    Jest to terminalvarduino IDE

    0
  • Pomocny post
    #11 03 Paź 2015 14:55
    Andrzej__S
    Poziom 28  

    Niestety, nie znam Arduino, ale jeśli jest to coś takiego (lub podobnego), to masz dostępne wszystkie opcje:

    Cytat:
    You can also change the enter key emulation to carriage return, line feed, both, or neither.


    Ustawienie to determinuje, jakie znaki są dołączane do wysyłanego tekstu po wciśnięciu klawisza Enter (lub naciśnięciu Send):

    No line ending - nic nie jest dołączane.

    Newline - znak nowej linii, tutaj najprawdopodobniej jest to znak LF (Line Feed) czyli '\n' (decymalnie 13, hexadecymalnie 0x0D).

    Carriage return - znak CR czyli '\r' (decymalnie 10, hexadecymalnie 0x0A).

    Both NL & CR - kombinacja dwóch znaków CR i LF (inaczej CRLF), najprawdopodobniej w tej właśnie kolejności (odwrotna kolejność - LFCR - jest używana raczej rzadko). Inaczej mówiąc przy tej opcji do tekstu wysyłanego dołączone zostają dwa znaki "\r\n" (to, o czym pisałem w poprzednim poście).

    Szczegóły.

    0
  • #12 08 Paź 2015 19:02
    Rezystoreczek
    Poziom 20  

    ja bym spr. tylko pierwszy znak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    dla pewności.

    0
  • #13 08 Paź 2015 21:01
    nelik1987

    Poziom 31  

    Rezystoreczek napisał:
    ja bym spr. tylko pierwszy znak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    dla pewności.


    ta litera C była tylko jako przykład, bo wpisywane będą całe słowa więc to by się nie sprawdziło.

    0
  • #14 11 Paź 2015 19:48
    Rezystoreczek
    Poziom 20  

    nelik1987 napisał:


    ta litera C była tylko jako przykład, bo wpisywane będą całe słowa więc to by się nie sprawdziło.


    do string (char *) masz strcmp, stricmp, i strncmp

    0
  • #15 11 Paź 2015 23:19
    uzi18
    Poziom 23  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jesli received_UART to faktycznie String, to na polecenie setup z terminala uzyskasz teraz poprawne dzialanie, trim wytnie wszystkie znaki ktore Cie nie interesuja.

    Przykład i opis działania:
    https://www.arduino.cc/en/Tutorial/StringLengthTrim

    0
  Szukaj w 5mln produktów