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.

radio.available zawsze zwraca 1

DejmDaniel 20 Cze 2018 14:03 186 2
  • #1 20 Cze 2018 14:03
    DejmDaniel
    Poziom 4  

    Witam, buduję zdalnie sterowane autko oparte na Arduino i modułach nrf24l01. Wszystko działa perfekcyjnie, tylko mam problem z kodem odbiornika. Funkcja radio.avaliable (coś jak serial.avaliable), zawsze zwraca 1. Chciałem napisać program tak, aby przy braku sygnału od nadajnika, odbiornik wykonał część programu by unieruchomić autko, bo inaczej jak straci zasięg to gna przed siebie z ostatnimi przyjętymi danymi z nadajnika. Pisząc po prostu ,,else,, to nie zadziałało a program nie wiedzieć czemu wykonuje pętle

    Kod: c
    Zaloguj się, aby zobaczyć kod
    oraz pętle
    Kod: c
    Zaloguj się, aby zobaczyć kod
    . Czy popełniłem gdzieś błąd w programie? Czy tak po prostu działa ta funkcja? Bo dziwne jest dla mnie to zę wykonuje if oraz else jednocześnie. Szukałem odpowiedzi w internecie, lecz wątki zwykle kończyły się bez rozwiązania. Da się to jakoś rozwiązać programowo? Z góry dziękuję za odpowiedzi.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • #2 20 Cze 2018 18:00
    JacekCz
    Poziom 36  

    DejmDaniel napisał:
    ... Bo dziwne jest dla mnie to zę wykonuje if oraz else jednocześnie. Szukałem odpowiedzi w internecie ....


    Nic się magicznie nie wykonuje.
    Nie mam szklanej kuli by powiedzieć co chciałeś, ale bloki nie wydają się logicznie, a NA PEWNO formatowanie kodu które prezentujesz wprowadza wzrok w błąd.

    Nie mam pojęcia jakiej magicznej biblioteki używasz, ale czy nie trzeba sprawdzić czy read naprawdę przeczytało oczekiwaną ilość danych?

    0
  • #3 22 Cze 2018 16:16
    emarcus
    Poziom 35  

    DejmDaniel napisał:
    . Czy popełniłem gdzieś błąd w programie? Czy tak po prostu działa ta funkcja? Bo dziwne jest dla mnie to zę wykonuje if oraz else jednocześnie. Szukałem odpowiedzi w internecie, lecz wątki zwykle kończyły się bez rozwiązania. Da się to jakoś rozwiązać programowo? Z góry dziękuję za odpowiedzi.


    Chociaż program nie jest najlepszy, to główny twój problem polega na błędnej (tak mi się wydaje) interpretacji funkcji:
    if(cośtam){}
    else {}
    Te dwa człony z natury eliminują się wzajemnie; to zn. Jeżeli pierwsz człon w if (cośtam) jest spełniony to wykonywany jest zespół instrukcj zawarty w {} następujący bezpośrednio po warunku i wtedy drugi człon ‘else’ jest pomijany/ ignorowany./
    Jeżeli natomiast pierwszy warunek nie jest spełniony, to wykonywana jest alternatywny człon else {}.
    Na przykład abstrakcyjnie:
    Ktoś mówi: -”Idź do sklepu i kup olej, a gdyby nie było oleju, to kup ocet”
    Który artykuł zakupisz?. Nie sadzę abyś zakupił cały sklep (!?).

    Wracajac do źródłowego problemu: ‘kommunikacja radiowa nadajnika i odbiornika’
    Jak już sam zauważyłeś odbiornik w zasadzie wykonuje ostatnie otrzymane instrukcje.
    Może inaczej;... te instrukcje sa w programie odbiornika, a przesyłasz cyklicznie (update) tylko zmieniane parametry pracy dla nich.
    W przypadku braku sygnału z nadajnika przez pewien przedział czasu, potrzebujesz zmienic te wbudowane w odbiorniku instrukcje i wysłac sterowany objekt do „stopp()” - ‘zaparkuj pojazd’.

    Jednym, (lecz nie jedynym) i chyba łatwym rozwiązaniem byłoby wysyłac z nadajnika w structurze packetu dodatkowy paramert/bit/charakter/cokolwiek.
    Program w odbiorniku zawierałby timer z optymalnie ustawionym czasem do odliczena jak długo pojazd może pracowac bez kontroli. Ten odebrany dodatkowy parametr resetuje timer do nastawionej wartości. W effekcie timer ten nie wyzeruje się dopuki napływaja impulsy resetujące.
    Po upływie tego czasu, nie resetowany timer wystawia bit w jakiejś zmiennej, który z kolei warunkuje/kieruje czy realizowac zadany główny program czy też zobic ‘skok do parkowania’./

    Mam nadzieję że tu koledzy zaraz nadeślą mnóstwo innych rozwiązań, lub poprawia ten koncept.
    Jak dotychczas nikt nie wyszedł z żadnym...

    e marcus

    0
  Szukaj w 5mln produktów