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] Uart rozdzielanie ciągu znaków

Ficu 17 Gru 2010 23:34 2778 8
REKLAMA
  • #1 8882106
    Ficu
    Poziom 31  
    Witam,
    Jest sobie program który wysyła dane w takim formacie:

    XX - zmienna1,
    ZZZ - zmienna2.

    Po stronie odbiorczej chciałbym rozdzielić to z powrotem na 2 zmienne tylko jak tego dokonać w bascomie? Teoretycznie mogę się pobawić na if...then bo zmienna1 może przyjmować 8 wartości a zmienna2 5 wartości. Może w ogóle zmienić wysyłanie zmiennych?
    Cel jaki chcę osiągnąć to wysłać 2 zmienne przez z 1 urządzenia uart i odczytać je oddzielnie na 2 urządzeniu.
  • REKLAMA
  • Pomocny post
    #2 8882124
    ZbeeGin
    Poziom 39  
    Jak XX i ZZZ to znaki przedstawiające liczbę, i dodatkowo ilość znaków jest zawsze taka sama to masz cztery proste operacje: s=MID(<parametry>), x=VAL(s), s=MID(<parametry>), z=VAL(s).
  • #3 8882194
    Ficu
    Poziom 31  
    Musze jakiś przykład z tym zobaczyć bo ciężko mi to pojąć ;/
    Co do XX i ZZZ to są to zmienne liczbowe, ilość znaków będzie taka sama, mogę nawet zrobić XZ gdzie zienna X przyjmowałaby wartość 1-8 a Z 1-5.
  • REKLAMA
  • Pomocny post
    #5 8882737
    mirekk36
    Poziom 42  
    To jest dosyć niewygodny sposób na przesyłanie zmiennych w postaci znaków ASCII i sam się nieco ograniczasz, bo pierwsza zmienna musi mieć zawsze dwa znaki, druga trzy itp...

    Jeśli chcesz troszkę bardziej uniwersalnie podejść do tematu to przesyłaj wartości zmiennych w ten sposób:

    PRINT XX,YYY,Z,KKKK


    czyli każda wartość oddzielona np przecinkiem.

    Później za pomocą kombinacji z funkcjami do obróbki stringów można wyłuskiwać poszczególne wartości i zamieniać je instrukcją VAL na liczby.

    Jako pierwsza może przydać się wtedy funkcja INSTR, za pomocą której znajdujesz pierwszy przecinek i jego pozycję, wtedy wiesz jaką liczbę bajtów stringu zamienić poprzez VAL na liczbę.

    Dzięki temu możesz przesyłać wiele i różnych liczb a nawet tekstów w jednej takiej ramce. Niestety operacje w Bascomie są troszkę ułomne i pamięciożerne jeśli chodzi o szybkie i wygodne parsowanie stringów/ tokenów. Za to w C to podstawa i są wbudowane funkcje, które od razu pozwalają wykonywać szybko takie operacje bez najmniejszych problemów. No ale w Bascomie też się da ;)
  • REKLAMA
  • #6 8891244
    Ficu
    Poziom 31  
    Witam,
    właśnie mam problemy z właściwą rozdzielaniem funkcji i programy mi nie śmigają.

    Program nadajnika:
    Do
    If S5 = 0 And S4 = 0 Then
       Komenda = 1
       Print Komenda ; Moc
    End If
       If S6 = 0 And S3 = 0 Then
       Komenda = 2
       Print Komenda ; Moc
    End If
    ...

    Założenie jest zrobienie komunikacji między 2 mikrokontrolerami przy użyciu modułów BTM-222. Moduły skonfigurowane odpowiednio, łączą się, komunikacja działa.

    Program odbiornika:
    Do
    Bufor = Waitkey()
    Smoc = Right(bufor , 1)
    Skomenda = Left(bufor , 1)
    If Smoc = "1" Then
    Moc = 127
    Elseif Smoc = "2" Then
    Moc = 153
    Elseif Smoc = "3" Then
    Moc = 177
    Elseif Smoc = "4" Then
    Moc = 203
    Elseif Smoc = "5" Then
    Moc = 228
    Elseif Smoc = "6" Then
    Moc = 255
    End If
    
    If Skomenda = "1" Then
       Reset P1
       Reset P2
       Reset P3
       Reset P4
       Pwm1a = Moc
       Pwm1b = Moc
       Toggle D2
    End If
    If Skomenda = "2" Then
       Set P1
       Set P2
       Set P3
       Set P4
       Pwm1a = Moc
       Pwm1b = Moc
    End If
    ...

    Efekt jest taki jakby odbierana była ciągle komenda = "1" bo dioda miga.
  • REKLAMA
  • #8 8894243
    Ficu
    Poziom 31  
    xury napisał:
    Nadawana Komenda to liczba, a po odebraniu porównujesz to do tekstu. ("1")

    Bo odbieram to stringiem. Źle?
  • #9 8902936
    Ficu
    Poziom 31  
    Trochę namotałem i nadal nie działa tak jak powinno, D2 miga podczas otrzymywania obojętnie jakiej komendy, a powinna migać tylko podczas komendy 1.

    Nadawanie:
    Print Komenda ; "," ; Moc


    Odbiór:
    Bufor = Waitkey()
    Znak = Instr(bufor , Szukana)
    Znak = Znak + 1
    Skomenda = Left(bufor , 1)
    Ssmoc = Mid(bufor , Znak , 1)
    Komenda = Val(skomenda)
    Smoc = Val(ssmoc)


    Dodano po 1 [godziny] 25 [minuty]:

    No w końcu udało się! Powodem wszystkich problemów był jakiś "syf" podczas odbierania danych oraz lepszym rozwiązaniem była komenda input.

    Działająca wersja odbioru i konwersji zmiennych:
    Input Bufor
    Znak = Instr(bufor , Szukana)
    Znak = Znak + 1
    Skomenda = Mid(bufor , 2 , 1)
    Ssmoc = Mid(bufor , Znak , 1)
    Komenda = Val(skomenda)
    Smoc = Val(ssmoc)
REKLAMA