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

[Bascom] Jak wyciągnąć zmienne z bufora UART po otrzymaniu znaku?

parafka 10 Paź 2019 20:08 717 5
  • #1 18212355
    parafka
    Poziom 20  
    Mam od co najmniej tygodnia kłopot z wyciągnięciem zmiennych z bufora uart i proszę Was o pomoc bo temat mi nie idzie. Pokonałem blututy, automatyczne łączenie się i teraz to.
    W nadajniku czekam na znak ? i jak odbiorę to w przerwaniu uxrc realizuję odpowiedź -wysyłkę trzech zmiennych:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    W odbiorniku mam bufor i czekam na znak CR(13)
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Próbuję to zrobić w ten sposób i nie działa. Do zmiennych nie przypisuje się nic co można zobaczyć na LCD, a gdy podejrzę zmienną Bufor to siedzi tam zmienna EVtxt z nadajnika. Podgląd zmienych robię na lcd, potem wysyłam znak ?(63) i czekam na odpowiedź.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Skończyły mi się pomysły. Próbowałem wysyłać całego stringa ale zmienna Lux ma różną liczbę znaków (1-5) i sprawa komplikuje się.
  • #2 18212519
    bart-projects
    Poziom 29  
    Trudno tak wypowiedzieć się bez całości kodu, ale czytałeś/widziałeś temat helpa "config serialin"?
    Serial0charmatch to raczej powinien być sub z etykietą i return a nie Sub i End Sub.

    Jest jeszcze jeden niuans. Znaki sa pobierane do bufora w przerwaniu i kiedy wykryty zostanie enter chcesz skoku do tej etykiety.
    To jest jednak kod który jest doklejany do obsługi przerwania. Z tego względu powinieneś zadbać o zachowanie rejestrów które używasz w tym przerwaniu. Jeśli nie wiesz które używasz powinieneś użyć polecenia Pushall i Popall :
    Cytat:
    When using the BYTEMATCH option, you must preserve the registers you alter. If you do not know which one, use PUSHALL and POPALL.


    Napisałem sobie taki pomocnik do Bascom ;)
    [Bascom] Jak wyciągnąć zmienne z bufora UART po otrzymaniu znaku?

    Zobacz czy teraz zadziała :D
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #3 18212771
    parafka
    Poziom 20  
    Dziękuję za poświęcenie czasu. Czytać to czytałem, ale te rozwiązanie z Subem zapożyczyłem od kogoś z elektrody komu działało podobne rozwiązanie.
    Zamieniłem na etykietę+return i proponowany kod z asm ale nic to nie dało.
    Mój program ma ponad 1000 linijek więc muszę powycinać i zostawić minimum do testów.
    Teraz w nadajniku nie czekam na znak ? tylko regularnie daję Printy co 999ms
    Lokalny lcd w nadajniku pokazuje w kolejnośći znak 1, znak 3, znaki 0,68 (byte,word,single*4)
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W odbiorniku niestety nic nie drgnąło. Jest albo 0 0 0 , albo coś przypadkowego 0 0 078457
    Gdy na LCD wrzucę zmienną bufor to ładnie widać zmienną EV z nadajnika tj. 0,68
    Wklejam poskracany ale żyjący kod z odbiornika.
    Czy nie dałoby się bez tych wstawek? Jestem raczej początkujący i wolałbym rozwiązania, które rozumiem :wink:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 18212900
    bart-projects
    Poziom 29  
    Działa elegancko. Żeby było wiarygodnie to nawet wygrzebałem Ardu Leonardo z m32u4 na pokładzie.

    Na jedną rzecz bym jeszcze uważał. Twój kod nie jest w żaden sposób synchronizowany. Może się kiedyś zdarzyć, że jedna z wiadomości nie dojdzie. Z nie będzie miało wartości 3 i przy nastepnej wiadomości procesor zacznie przypisywać wartości innych zmiennych czyli EV dostanie ID, LX dostanie EV a EV dostanie w następnej turze ID...
    [Bascom] Jak wyciągnąć zmienne z bufora UART po otrzymaniu znaku?
    Usunąłem wstawkę, ale jak widzisz zastosowałem się do sugesti z helpa i dodałem Pushall i Popall
    Poniżej kody użyte do testu:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Pomiędzy Twoją wypowiedzią a kodem znalazłem pewną rozbieżność. Jeśli nadajesz EV Single=0.68 a potem w odbiorniku EV masz jako Word to wynikiem rzutowania 0.cokolwiek z Single na Word zawsze będzie część przed przecinkiem czyli tutaj zero.

    Osobno uważam, że w przerwaniu można by robić jak najmniej czyli po odebraniu znaku 13 tylko ustawić flagę "Got_msg=1" i potem w pętli głównej wciągnąć dane z bufora. To daje szanse innym przerwaniom w bardziej wymagających aplikacjach.

    Co do synchro i tego że zmienna EV ma czasem od 1 do 5 znaków... wyślij wszystkie dane za jednym razem za pomocą Hexstring - tam nawet zero ma zawsze wartość "00" potem odzyskaj wartości poprzez Hexval()
    String zawsze będzie miał tyle samo liter/znaków i można odrzucić taki za krótki.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    W odbiorniku coś na taki wzór:
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    Do tego można dodać sprawdzanie czy w Hexstringu znajdują się tylko ważne znaki czyli od A do F wybierając bibliotekę "$LIB "hexval.lbx" a potem sprawdzając flagę ERR ;)
  • #5 18213750
    parafka
    Poziom 20  
    Dziękuję bardzo za wyczerpującą odpowiedź.
    Wracam do dalszej pracy.

    Dodano po 5 [godziny] 9 [minuty]:

    Jeszcze wrócę do tematu.
    Pierwsza wersja działa bardzo ładnie -dziękuję.
    Sprawdzam wersję z hex bo ta wydaje się jeszcze lepsza i mam sukces przy dwóch pierwszych zmiennych.
    Trzecia EV jest Single i kompilator krzyczy błędem w linii EV = Hexval(helpstr).
    Zrobiłem testowo EV as Word aby kompilacja przeszła i na lcd widać EV w postaci m.... Kurcze, bardzo fajny pomysł z tym hex tylko te hexval do single nie chce wejść....

    Pomęczyłem jeszcze te hexy, pozbyłem się zmiennej Single w nadajniku przez pomnożenie EV*100 i przypisanie do Word aby pozbyć się mało znaczących miejsc po przecinku. Niestety przy testach okazało się, że moje EV czasem ma ujemną wartość i sposób nie działa.
    Zostaję przy pierwszym pomyśle kolegi Bartka.
    Temat z podziękowaniami zamykam.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod

    Kod: VB.net
    Zaloguj się, aby zobaczyć kod
  • #6 18216199
    bart-projects
    Poziom 29  
    Przepraszam, że tak późno, ale nie zawsze jest czas na fora :D
    Z tym prostym hexval dla single pewnie się zagalopwałem, ale wartość da się bez problemu odzyskać tnąc string po cztery literki i tak otrzymane wartości Word nałożyć na Single.
    Poniżej na symulacji widać, że działa elegancko ;) Wysyłam wartść 0.68 by zerknąc jak zbudowany jest string. Potem przepisuję go do zmiennej Bufor tak by udać, że odebraliśmy go w odbiorniku. Na końcu wyciągam ze stringa wartość 0.68 ;)
    Życzę miłej niedzieli.
    Kod: VB.net
    Zaloguj się, aby zobaczyć kod


    [Bascom] Jak wyciągnąć zmienne z bufora UART po otrzymaniu znaku?
REKLAMA