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

Odbiór danych z urządzenia po rs232 - program w BASCOM AVR

guest666 17 Lis 2011 12:13 5098 18
REKLAMA
  • #1 10148602
    guest666
    Poziom 12  
    Witam
    Mam taki problem, a mianowicie nie wiem jak się do tego zabrać.
    Układ mam na ATMEGA16
    Mam pewne urządzenie, które po RS232 wysyła dane w postaci:

    Cała ramka zawsze składa się zawsze z 32 bytów

    AAAA B1XX B2XX B3XX B4XX B5XX CHK WW XYZ

    AAAA , CHK , XYZ - stała wartość
    WW - suma kontrolna wszystkich bytów włącznie z CHK
    B1, B2, B3, B4, B5 - numer paczki np: B1 = 42 31 ; B2 = 42 32 ; B3 = 42 33
    XX - wartości które mnie interesują

    Jak wyłowić teraz dane XX z paczki B2 ???
    Potrzebuje je wyświetlić na LCD
    Proszę o jakiś przykład w BASCOMIE, żebym miał od czego zacząć.
    Z góry dziękuję
    Pozdrawiam
  • REKLAMA
  • #2 10148686
    korrus666
    Poziom 40  
    Zacznij od poprawnego pisania, nie bytów tylko bajtów. Czy tak nie jest bardziej po polsku. Byt to raczej coś innego:)
    Algorytm jest bardzo prosty.
    Na początku szukasz nagłówka, więc czytasz bajty aż 4 kolejne będą miały wartość A.
    Potem czytasz kolejne i przypisujesz sobie do odpowiednich zmiennych. A potem to już robisz z nimi co chcesz.
  • REKLAMA
  • #3 10148735
    guest666
    Poziom 12  
    Tak jak pisałem wcześniej...
    Proszę o jakiś przykład...
    Nie chcę gotowego programu, tylko przykład...aż tak nie jestem obeznany w bascomie
    Nie wiem jak wyszukać...
    Dzięki.
  • #4 10148990
    jousto
    Poziom 17  
    a w jaki sposób jest zakończony ten ciąg 32 bajtów?
    czy to <CR> czy <CR>+<LF> czy moze jeszcze coś innego?
    czy potrzebujesz zawsze tylko danych z paczki B2?
    Czy znasz zasady obliczania sumy kontrolnej?
  • #5 10149000
    guest666
    Poziom 12  
    jousto napisał:
    a w jaki sposób jest zakończony ten ciąg 32 bajtów?
    czy to <CR> czy <CR>+<LF> czy moze jeszcze coś innego?
    czy potrzebujesz zawsze tylko danych z paczki B2?
    Czy znasz zasady obliczania sumy kontrolnej?


    <CR><LF> #0 - tak jest zakończony
    0D 0A 00
    #13 #10 #0

    sume kontrolną obliczam dodając all bajty włącznie z CHK
    Dane ogólnie potrzebuje z każdej paczki, a napisałem tak tylko dla przykładu
  • REKLAMA
  • #6 10149579
    Konto nie istnieje
    Poziom 1  
  • #7 10149885
    guest666
    Poziom 12  
    emarcus napisał:
    guest666 napisał:
    Witam


    Jak wyłowić teraz dane XX z paczki B2 ???


    Bascom: Array, Index

    e marcus


    Ehh

    No prosiłem o przykład...
    Po co mam "wyważać otwarte drzwi"...
    jeśli ktoś wie to niech się podzieli przykładem...
    ....
  • #9 10152881
    guest666
    Poziom 12  
    xury napisał:
    Przykłady parsowania danych tekstowych masz w helpie - keyword reference - string.
    Np polecenia typu LEFT, MID, RIGHT itd. wraz z opisem działania masz przykłady.


    Do
    
       Bufor = Ischarwaiting()                      'Sprawdz czy cos jest w buforze
       If Bufor = 1 Then
       Waitms 250
       Gosub Odczytaj_sprzetowy_uart                            'Jesli jest to odzcytaj
       Oblicz
         Cls
        Locate 1 , 1
        Lcd Dane;
        Locate 2 , 1
        Lcd Bp
    
        Locate 2 , 6
        Lcd V1
        Locate 2 , 9
        Lcd V2
       Wait 5
        Cls
       Gosub Oproznij_bufor
    
    
       End If
    
    Loop
     End
    
    
    Sub Oblicz
    
    Szukane = "CHK"                                             'szukamy słowa
    Bp = Instr(dane , Szukane)
    
    V1 = Mid(dane , 7 , 1)
    V2 = Mid(dane , 8 , 1)
    
    
    End Sub
    
    
    
    Odczytaj_sprzetowy_uart:
    
    Dane = ""
    
    Do                            'Odbierz znak po znaku
      Kod = Inkey()
      If Chr(kod) = "" Then Kod = "0"
      Dane = Dane + Chr(kod)                                    'Zapisz w Dane
      'Bufor = Ischarwaiting()                                   'Zakoncz jeśli CR lub brak znaku
    Loop Until Kod = "K"
    Return
    
    
    Oproznij_bufor:
    
    Do
       Kod = Inkey()                                            'Czyści bufor
       Bufor = Ischarwaiting()
    Loop Until Bufor = 0
    Return


    COś takiego skleciłem i działa, ale jak teraz zamienić dane które wyciąłem z ramki
    V1 = Mid(dane , 7 , 1)
    V2 = Mid(dane , 8 , 1)
    i zamienić je na dane typu byte...
    Dane które otrzymuje (V1 i V2) są to kody ASCII a ja je potrzebuje zamienić na liczby dziesiętne które będę dzielił i mnożył

    Proszę pamiętać....są to kody ASCII (pojedyncze znaki)

    Proszę o pomoc
  • #10 10153234
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #11 10153283
    guest666
    Poziom 12  
    atom1477 napisał:
    Ale po co zamieniałeś to na pojedyncze znaki? Teraz zrobienie konwersji na Byte jest trudniejsze niż by było gdybyś to pozamieniał na całe stringi (i wtedy był bym skłonny dać gotowca :D).


    Ok to może zaczne od początku...

    jak odebrać dane w postaci hexów?
    urządzenie mi śle all dane hexadecymalnie....a kod
    Kod = Inkey()
    If Chr(kod) = "" Then Kod = "0"
    Dane = Dane + Chr(kod)

    odbiera jako ascii

    takie coś wypluwa mi hyperterminal

    4D 45 53 53 4D 30 00 D2 4D 31 20 BF 4D 32 00 01 4D 33 00 0B 4D 34 0D CF 43 48 4B 07 22 0D 0A 00

    a na LCD w układzie testowym mam to w ASCII
  • #12 10153618
    Konto nie istnieje
    Poziom 1  
  • #13 10153649
    guest666
    Poziom 12  
    Zacząłem od początku:
    
    Dim Bufor As Byte
    Dim Dane As String * 32
    
    Do
    
       Bufor = Ischarwaiting()                                  'Sprawdz czy cos jest w buforze
       If Bufor = 1 Then
         Kod = Inkey()
         Lcd Kod
         Wait 1
    
      End If
    Loop
    


    na wyświetlacz wypluwane są mi wartości : 77 69 83 83 77 48 02 36....itd..
    W tabeli ASCII odczytałem że powstaje: MESSM0...itd..
    jak teraz zapisać te wartości dziesiętne do jednego stringu, ale w postaci dziesiętnej a nie ASCII
    Są to nie zawsze 64 znaki, tam gdzie powinny być dwa zera to jest jedno

    Zlituje się ktoś i pomoże??
  • #14 10154493
    Konto nie istnieje
    Poziom 1  
  • #15 10154796
    guest666
    Poziom 12  
    atom1477 napisał:
    guest666 napisał:
    Są to nie zawsze 64 znaki, tam gdzie powinny być dwa zera to jest jedno

    A są pomiędzy nimi spacje?

    guest666 napisał:
    Są to nie zawsze 64 znaki, tam gdzie powinny być dwa zera to jest jedno

    Wcześniej napisałeś co innego:
    guest666 napisał:
    4D 45 53 53 4D 30 00 D2 4D 31 20 BF 4D 32 00 01 4D 33 00 0B 4D 34 0D CF 43 48 4B 07 22 0D 0A 00


    Ten ciąg znaków jest z hyperterminala, a na moim LCD w układzie wyświetl tyko jedno zero
    Spacji nie ma... ja tylko rozdzieliłem kolejne bajty

    Chyba nie jest to jakiś wielki problem dla osoby która miała z Uartem do czynienia, żeby podać rozwiązanie.....
    Myślę że dla osób będących w temacie to jest pikuś, ale ja raczkuje i dlatego proszę o pomoc
  • #16 10155172
    Konto nie istnieje
    Poziom 1  
  • #17 10156631
    guest666
    Poziom 12  
    Po wielu spędzonych godzinach...doszedłem do prostego rozwiązania....

    Ramkę złożoną z 32 bajtów odbieram w poniższy sposób:
    
    If Ischarwaiting() = 1 Then
      Inputbin Mess_1 , Mess_2 , Mess_3 , Mess_4 , M0_1 , M0_2 , M0_3 , M0_4 , M1_1 , M1_2 , M1_3 , M1_4 , M2_1 , M2_2 , M2_3 , M2_4 , M3_1 , M3_2 , M3_3 , M3_4 , M4_1 , M4_2 , M4_3 , M4_4 , Chk_1 , Chk_2 , Chk_3 , Suma_1 , Suma_2 , Koniec_1 , Koniec_2 , Koniec_3 , 32
    End If
    

    Dzięki czemu mogę sobie robić operacje na poszczególnych bytach ramki.

    Może zaraz dużo ludzi się wypowie na ten temat, że można było prościej, mniej pamięci można było użyć...pewni można było...ale cza było napisać jakiś cholerny przykład, a tak to spędziłem dużo czasu......ehh... myślałem że forum jest po to by pomagać, rozwiązywać problemy,....., a nie cwaniaczyć i pisać, że było to już 1000razy poruszane...

    Ale oczywiście niech ktoś wstawi swój prostszy przykład.....
  • #18 10160708
    xury
    Specjalista automatyka domowa
    Kolego nie wiem czemu się złościsz. Już Ci wcześniej napisałem, że przykładów masz pełno w helpie od Bascoma. Zarówno w tym polskim od Zbigeen'a jak i w angielskim.
    Przeczytaj go uważnie i przeanalizuj przykłady z helpa i katalogu Samples to będziesz wiedział jakie polecania użyć.
  • #19 10507316
    guest666
    Poziom 12  
    Ramkę złożoną z 32 bajtów odbieram w poniższy sposób:
    Kod:

    If Ischarwaiting() = 1 Then
    Inputbin Mess_1 , Mess_2 , Mess_3 , Mess_4 , M0_1 , M0_2 , M0_3 , M0_4 , M1_1 , M1_2 , M1_3 , M1_4 , M2_1 , M2_2 , M2_3 , M2_4 , M3_1 , M3_2 , M3_3 , M3_4 , M4_1 , M4_2 , M4_3 , M4_4 , Chk_1 , Chk_2 , Chk_3 , Suma_1 , Suma_2 , Koniec_1 , Koniec_2 , Koniec_3 , 32
    End If

    Oczywiście to jest dobre rozwiązanie, jeśli jest stała długość ramki
REKLAMA