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

Przesyłanie dwóch temperatur z 2xDS1820 uart

lenny35 04 Maj 2010 09:42 1347 8
  • #1 8032851
    lenny35
    Poziom 13  
    Witam!

    Piszę kolejnego posta w tej sprawie bo w ostatnim chyba mnie nie zrozumiano.

    Otóż wysyłam dwie temperatury przez uart tak:
    Config Serialout = Buffered , Size = 6
    
    Enable Interrupts
    
    Dim T1 As Byte
    Dim T1_wys As String * 4
    
    Dim T2 As Byte
    Dim T2_wys As String * 4
    
    T1_wys = Str(t1)
    T2_wys = Str(t2)
    
    Print T1_wys ; Chr(13) ;
    Print T2_wys ; Chr(13) ;


    A odbieram tak:
    Config Serialin = Buffered , Size = 20
    
    Enable Interrupts
    
    Dim T1_wys As String * 4
    Dim T1 As Byte
    
    Dim T2_wys As String * 4
    Dim T2 As Byte
    
    Input T1_wys
    T1 = Val(t1_wys)
    
    Input T2_wys
    T2 = Val(t2_wys)


    Problem mój leży w tym, że czasem przy wyświetlaniu na odbiorniku:

    Locate 1 , 1
    
    Lcd "Piec:   " ; T1 ; Chr(0) ; "     "
    
    Locate 2 , 1
    
    Lcd "Bojler: " ; T2 ; Chr(0) ; "     "


    W miejscu gdzie ma być temp. pieca pojawia mi się temp. bojlera.
    W jaki sposób zabezpieczyć transmisję, żeby odbiornik nie mylił pobieranych danych? Jakiś znak na końcu przesyłanych danych? Dopiero zaczynam zabawę z uart i bardzo był bym wdzięczny za jakiekolwiek podpowiedzi.
  • #2 8032867
    ksarim
    Poziom 15  
    Daj jakikolwiek znacznik np. przed wysyłaniem danej temperatury. Może to być np. $ # & itd. Program w odbiorniku po rozpoznaniu tego znaku będzie mógł poprawnie przyporządkować odbieraną temperaturę i właściwie ją wyświetlić.
  • #3 8032896
    lenny35
    Poziom 13  
    Ksarim, a czy mógłbyś jeszcze mi powiedzieć jakiej komendy do tego użyć i jak to pożenić? Jakiś mały przykład? Sorry, że tak dopytuję ale nie jestem jeszcze tak biegły w bascomie.
  • #4 8032938
    ksarim
    Poziom 15  
    Zaproponowałem rozwiązanie ale kodu w Bascomie Ci nie podam bo nigdy nie pisałem w tym języku.
  • #5 8036313
    MaxX850
    Poziom 13  
    Przesyłam przez uarta pomiar z trzech ds'ów. Składam sobie to w jeden łańcuch przed wysłaniem na uarta, a po odebraniu, poleceniem MID wyciągam to co mnie interesuje w danej części kodu. Trzeba tylko pamiętać o stałej długości każdej temperatury, tak żebyś w danym miejscu łańcucha miał zawsze to co trzeba. Jakieś uzupełnianie spacją np. Chociaż rozwiązanie z wstawianiem znacznika jest wg mnie bardziej eleganckie.
  • #6 8036343
    utak3r
    Poziom 25  
    Najbardziej elegancko by było, gdybyś skonstruował taką ramkę:

    
    [ID_termometru][Ilość bajtów w paczce][DANE][CRC]
    


    Kodu nie podam, bo na oczy Bascoma nie widziałem. Ale tak generalnie to powinno wyglądać, zwłaszcza, gdybyś chciał w przyszłości dodać jeszcze więcej czujników.
  • #7 8036858
    lenny35
    Poziom 13  
    MaxX850 mógłbyś podać jakiś przykład jak składasz to w jeden łańcuch?
    Jestem niedoświadczony w bascomie i wszelkie przykłady bardzo mi pomogą.
  • Pomocny post
    #8 8038963
    MaxX850
    Poziom 13  
    Temperaturę odczytaną z ds'a formatuję i wrzucam do zmiennej string poleceniem FUSING, np:

    Temp = Fusing(t1 , "#.#")

    gdzie Temp to string, a t1 to zmienna single z odczytaną temperaturą. Następnie mam kilka warunków if..then gdzie zmienna Temp jest uzupełniana znakami (np. spacji), tak aby fragment łańcuch z pojedynczą temperaturą miał zawsze tą samą długość niezależnie od tego czy temperatura to 125, 25 czy 5 stopni i czy występuje znak "-". Zawsze ma to być 5 znaków (założenie na moje konkretne potrzeby). Następnie używam polecenia MID do złożenia sobie takiej prymitywnej ramki, np:

    Mid(wyslij , 1 , 5) = Temp

    gdzie wyslij to zmienna typu string o długości odpowiedniej do ilości pomiarów jakie chcę wysłać. Sytuacja powtarza się dla kolejnego czujnika i tylko "przesuwam" się po zmiennej wyslij, np:

    Mid(wyslij , 6 , 5) = Temp

    itd.
    W odbiorniku również korzystasz z polecenia MID. Przykład:
    [code]
    Config Serialin = Buffered , Size = 30
    Dim D As String * 12
    Dim Z As String * 5
    Dim A As Byte
    Enable Interrupts
    Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 'znak stopnia
    Cursor Off
    Cls
    Lcd "RS232 2x DS18B20"
    Do
    A = Ischarwaiting()
    If A = 1 Then
    Input D
    Z = Mid(d , 2 , 5)
    Locate 2 , 1
    Lcd Z
    Locate 2 , 6
    Lcd Chr(0) ; "C"
    Z = Mid(d , 7 , 5)
    Locate 2 , 10
    Lcd Z
    Locate 2 , 15
    Lcd Chr(0) ; "C"
    End If
    [/code]
    Nie jest to zbyt eleganckie rozwiązanie, ale nie muszę w odbiorniku wyszukiwać znacznika - wiem gdzie szukać tego co mnie interesuje. To takie przykłady na szybko. Mimo wszystko proponuję Tobie pobawienie się w budowę ramki. Przyda się na przyszłość. Powyższy sposób przesyłu wyników pomiarów zastosowałem w urządzeniu które ma trzy czujniki ale pracujące na osobnych liniach 1wire.
  • #9 8039205
    lenny35
    Poziom 13  
    Dzięki MaxX850, trochę mi się to wszystko rozjaśniło. Spróbuję teraz wykombinować coś swojego, bo moje urządzenie już działa ale chcę do zrobić porządnie.
REKLAMA