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

[Bascom] - Odczyt z uart i zamana na zmienną numeryczną?

marciu11 23 Cze 2011 23:09 1966 5
REKLAMA
  • #1 9644238
    marciu11
    Poziom 15  
    Witam.
    Mam problem ze zmianą odebranych danych z Uart'a na zmienną liczbową.

    Mianowicie na jednej Atmedze mierzę poprzez ADC wartość prądu i wysyłam ją na uart'a.
    Na drugiej Atmedze odbieram te dane i tu nie mam problemów - wysłane i odebrane dane się zgadzają i są poprawne.
    Ale odebrane dane są stringiem, nie mogę nic z nimi zrobić (matematycznie).

    Komenda VAL() nic nie daje. Odebrana dana z uart'u po zmianie przez VAL() ma zawsze 0.

    Jak zmienić tego odebranego stringa na liczbę?

    Zmienna programowa string po VAL() się zmienia na liczbę, a zmienna odebrana z uartu ma wartość 0...

    Program zredukowałem do praktycznego zera. Ot aby odbierał i wyświetlał na LCD odebraną wartość.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Może mi ktoś wyjaśnić co robię źle? Ewentualnie jak to zrobić inaczej.

    Pozdrawiam
    Marcin
  • REKLAMA
  • Pomocny post
    #2 9644270
    Fredy
    Poziom 27  
    Najprawdopodbniej w tej zmiennej coś jest jeszcze na końcu. Mogą być znaki niewidoczne, np CR lub /i LF.
    Spróbuj wyświetlić długość tego stringa (w Bascomie chyba funkcja Len) i wtedy bedziesz wiedział czy aby tam jest tylko liczba.
    Możesz spróbować też konwertować tego stringa po jednej cyfrze, a więc robisz pętlę w której wycinasz fragment stringa (funkcja Mid) i to poddajesz obróbce przez Val. Wtedy znajdziesz źródło błedu.
  • REKLAMA
  • #3 9644277
    marciu11
    Poziom 15  
    Dzięki za podpowiedz.
    Już to sprawdzam.

    Edit:

    Jak podałeś w stringu były dane LF na początku odczytanego stringa i dlatego był problem z tłumaczeniem zmiennej. Dzięki za naprowadzenie!

    Jeszcze wątku nie zamykam, gdyż mogę jeszcze trafić na problem i w razie czego szkoda zakładać nowy wątek.

    Pozdrawiam


    Edit2:

    Niestety powracam z problemem :(
    Program działa i funkcjonuje prawidłowo. Niestety dla przesyłania jednej zmiennej.
    Program dla odbioru jednej zmiennej wygląda tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Ale gdy w programie nadającym ustawię:

    Kod: text
    Zaloguj się, aby zobaczyć kod


    a odbieram:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Program w ogóle nie wchodzi w przerwanie (próbowałem też po zmiennej Y wysłać Chr(13) - koniec linii sprawdzany przy odbiorze i nic).

    Jak powinno wyglądać nadawanie i odbiór paczki kilku zmiennych, aby dało się je tu odebrać?
    Być może w nadajniku powinienem jakoś obrobić odczytane dane, aby dały się wysłać jednym "strumieniem". Coś w stylu: "a1234a1234a1234" i po tych znacznikach "A" później dzielić w odbiorniku strumień na poszczególne zmienne? Na przykład do tablicy?

    Niestety po transmisję danych po uarcie nigdy nie sięgałem i dopiero staram się to rozgryźć. A zarazem nie chciał bym wyważać otwartych już drzwi.
  • REKLAMA
  • #4 9645956
    Fredy
    Poziom 27  
    Zrezygnuj z funkcji Input, znacznie lepsza jest Inkey w pętli. Wtedy masz nad wszystkim kontrolę.
  • REKLAMA
  • #5 9647061
    xury
    Specjalista automatyka domowa
    Według mnie Input jest lepsze. By pozbyć się LF ze zmiennej wystarczy odpowiednio ustawić Config Input = CRLF
    Tylko technika odbioru jest inna. W podprogramie Serial0charmatch ustawiaj tylko flagę, a odbiór danych realizuj w pętli głównej.
  • #6 9647376
    marciu11
    Poziom 15  
    Dzięki. Spróbuję obu metod.
    A dlaczego w podprogramie jedynie ustawić flagę a całość operacji realizować w głównej pętli? Jaka jest zaleta tego rozwiązania a wady obsługi w podprogramie?

    Pytam gdyż pętla główna w docelowym programie będzie miała i tak co robić, więc nie chciał bym jej jeszcze dodatkowo blokować.

    Na razie problem odbiory kilku danych rozwiązałem w stylu opisanym powyżej.
    Mianowicie w nadajniku sklejam zmienne z przedrostkiem (przed każdą zmienną) "/" A w pętli odbioru gdy napotkam na wartość znaku "/", zmieniam index w tablicy. I tak kolejne odcinki odebranego stringu trafiają do oddzielnych zmiennych w tablicy.

    Jedyne co, to co jakiś czas mam odebrany string o zerowej długości z tym sobie poradziłem warunkiem aby opuszczał cały odbiór jak sting ma 0 długość.

    Ale popróbuję jeszcze z tymi podpowiedziami pokombinować.
    Pozdrawiam
REKLAMA