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

VB6 - Jak poprawnie obsłużyć zmienne z portu RS w TextBox?

snow 05 Lut 2006 18:55 1413 16
REKLAMA
  • #1 2264206
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Mam problem z napisaniem aplikacji w VB do obsługi RS'a. Może akurat znajdzie się ktoś kto mi pomoże Wink

    Zrobiłem sobie sterownik który po naciśnięciu przycisku wystawia na port RS zmienną o wartości z przedziału 1-1023. W programie w komputerze jest sobie okienko tekstowe TextBox w które jest wczytywana wartość przeczytana z portu. Jeżeli naprzykład zmienna ma wartość 43 to jak nacisne przycisk to wysyłany jest nieskończony ciąg liczbowy 4343434343434343 który przestaje być wysyłany w momencie puszczenia przycisku. Okienko zablokowałem sobie na pocztek na 2 znaki no i jak ze sterownika przychodzi wartość 1 to w okienku mam 11 :|, a powinno być 1.Jeżeli wysyłam 43 to w okienku potrafi się pojawić nawet 34, a jezeli przekrocze zakres dwuznakowy okienka i spowrotem wroce to wysylania zmiennej skladajacej się z dwoch znaków jak ta 43 to mam 34.

    Próbowalem też ustawić żeby sterownik wysyłał zmienną w postaci p43k, gdzie literki p i k oznaczałyby odpowiednio poczatek i koniec zmiennej. Potem w programie kazałem:

    1. wyczyścić okienko jak przyjdzie "p"
    2. przeczytać kolejne dwa znaki
    3. wyczyścić okienko jak przyjdzie "k"

    i też nie bardzo chcialo działać.

    Po kilku modyfikacjach osiągnąłem kod:


    
    Private Sub Command2_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer1.Enabled = True
    End Sub
    
    
    Private Sub Command2_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer1.Enabled = False
    End Sub
    
    
    Private Sub Command3_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer2.Enabled = True
    End Sub
    
    Private Sub Command3_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Timer2.Enabled = False
    End Sub
    
    Private Sub Form_Load()
    
    MSComm1.CommPort = 1  'comm port no.
    MSComm1.Settings = "9600,N,8,1" 'Port Settings
    MSComm1.RThreshold = 4
    MSComm1.InputLen = 4
    MSComm1.PortOpen = True
    Timer1.Enabled = False
    Timer2.Enabled = False
    
    
    
    End Sub
    
    Private Sub MSComm1_OnComm()
    Text1.Text = MSComm1.Input
    
    End Sub
    
    Private Sub Timer1_Timer()
    MSComm1.Output = "A"
    End Sub
    
    Private Sub Timer2_Timer()
    MSComm1.Output = "B"
    End Sub
    


    Ale on również nie zawsze czyta mi dane tak jak powinien, czasem przy odczytywaniu z portu "1" przeczyta "1" a czasem "1111"

    Ustawianie wartości w sterowniku z poziomu komputera działa poprawnie. Tylko mam problem z odbiorem.

    Może ktoś się na tym zna i byłby w stanie mi pomóc? Chciałby później mieć możliwość podstawienia tej zmiennej do paska postępu żeby mieć w zależności od wartośći zmiennej rózne zapełnienie tego paska.

    W terminalu nie mam problemów z odczytywaniem poprawnej wartości więc najprawdopodobniej błędnie korzystam z portu w VB, ale co robie źle to nie mam pojęcia.
  • REKLAMA
  • #2 2268557
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Czy urzadzenie przysylajace dane wysyla je nonstoper czy odpowiada na polecenia wyslane z kompa?
  • #3 2268617
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Urządzenie wysyła dane po otrzymaniu znaku "W"

    Udało mi się pokonać problem z odczytem danych jednoznakowych. Aktualnie program wygląda tak:

    
    Private Sub Command2_Click()
        MSComm1.Output = "A"
    End Sub
    
    Private Sub Command2_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Timer1.Enabled = True
    End Sub
    
    Private Sub Command2_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        Timer1.Enabled = False
    End Sub
    
    Private Sub Command3_Click()
        MSComm1.Output = "B"
    End Sub
    
    Private Sub Command3_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
        Timer2.Enabled = True
    End Sub
    
    Private Sub Command3_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
        Timer2.Enabled = False
    End Sub
    
    Private Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.RThreshold = 2
        MSComm1.PortOpen = True
        Timer1.Enabled = False
        Timer2.Enabled = False
        Timer3.Enabled = True
    
    End Sub
    
    Private Sub MSComm1_OnComm()
        Text1.Text = Val(MSComm1.Input)
    End Sub
    
    Private Sub Timer1_Timer()
        MSComm1.Output = "A"
    End Sub
    
    Private Sub Timer2_Timer()
        MSComm1.Output = "B"
    End Sub
    
    Private Sub Timer3_Timer()
        MSComm1.Output = "W"
    End Sub
    


    czyli problem który opisywałem wcześniej znikł. Natomiast teraz ustawiłem żeby urządzenie wystawiało 2 zmienne na port. Jeżeli od komputera przyjdzie RS'em znak "W" to urządzenie wystawia na port dane w postaci:

    zmienna1, 13, zmienna2, 13

    Chciałbym te dwie zmienne umieścić w dwóch textbox'ach. Żeby zmienna1 została wyświetlona w TextBox1, a zmienna2 w TextBox2, tylko nie wiem jak wydobyć z tego co wystawia urządzenie te dwie zmienne i je władować w odpowiednie TextBox'y. W końcowym programie sterownik będzie wysyłał 5 zmiennych: zmienna1, zmienna2, zmienna3, zmienna4 oraz zmienna5 i chciałbym żeby wylądowały odpowiednio w TextBox1, TextBox2, TextBox3, TextBox4 i TextBox5.
  • Pomocny post
    #4 2270690
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Ja osobiscie zrobilbym w ten sposob:

    Dane maja miec jakas maxymalna wartosc.
    U Ciebie jest to 1023 czyli w jednym bajcie sie nie zmiesci.
    Ale w zakresie dwuch bajtow smialo.
    Czyli ustawiasz port na byte i na inputlen = 2
    Bedziesz otrzymywal zdarzenie OnComm co dwa bajty
    Czy bedzie to liczba 0 czy 1023 zapisana bedzie w dwuch bajtach
    To samo musi byc zaimplementowane do urzadzenia nadawczego.
    Dzieki temu bedziesz mogl rozdzielic ciag danych na kilejne np. TextBoxy.

    Drugie rozwiazanie to Impuls np na linii RTS generowany po kazdej wyslanej danej.
    Dzieki temu dane moga miec zmienna dlugosc.

    pozdr.
  • REKLAMA
  • #5 2270904
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    sivex napisał:

    Czyli ustawiasz port na byte i na inputlen = 2
    Bedziesz otrzymywal zdarzenie OnComm co dwa bajty
    Czy bedzie to liczba 0 czy 1023 zapisana bedzie w dwuch bajtach
    To samo musi byc zaimplementowane do urzadzenia nadawczego.


    Ale domyślnie chyba jest ustawione jako byte bo domyślnie:

    MSComm1.InputMode = comInputModeText

    Chyba że to gdzieś indziej się ustawia, ale jakoś nie znalazłem gdzie.

    sivex napisał:

    Dzieki temu bedziesz mogl rozdzielic ciag danych na kilejne np. TextBoxy.


    A w jaki sposób?

    Po dodaniu MSComm1.InputLen = 2 w TextBox1 rzeczywiście zmienne są wyłapywane osobno bo raz jedna, raz druga się pojawia (ale tylko jeśli pierwsza jest 1 znakowa a druga 2 znakowa). Ale jak je rozdzielać na TextBoxy?
  • #6 2271167
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Text to jest tekst
    Binary to jest postac binarna danych

    Czyli 1 jako text to jest 1
    a 1 jako binarka to jest np 49

    Ta wartosc 49 jest zapisana w jednym bajcie.i czy to bedzie 1 czy np 125 to dalej jest jeden bajt.
    Jako text 1 to jest jeden znak a 125 to sa trzy znaki.

    Pomysl to tak jakbys chcial sie gogadac z druga osoba.
    np ze mna :)
    Ustalamy ze bede Ci przysylal parametry i dostaniesz maila:
    174652874383
    i tu jest piec wartosci.
    wiesz jakie?

    jezeli bedziesz mial mozliwosc odczytania znacznika na dodatkowej linii rs'a to tak jak bym stawial odstepy.
    174 65 28 74 183


    Jezeli ustalimu ze bede je zapisywal w jednym bajcie czyli 255 mozliwosci,
    to dostaniesz 5 bajtów informacji w pierwszym zapisze wartosc 174, w drugim 65... itd
    czyli:
    "®AJ·" (AE411C4AB7)


    pozdr.
  • #7 2271229
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    No tak, urządzenie wysyłą po każdej danej 13, ktora służy komputerowi do rozpoznawania czy zakończona została transmisja jednej zmiennej. Niestety Wygenerowania impulsu na linii nie moge zrealizować bo cały mikroprocesor w sterowniku mam wykorzytany więc zostaje zorbienie tego programowo. Może trzeba zliczać ile razy przyszła 13 od urządzenia i na podstawie tego wyliczać gdzie ma władować? Próbowałem takie coś zrobić ale nie wyszło :(
  • #8 2271622
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Ale 13 binarnie czy tekstowo.
    Jezeli binarnie to bardzo dobrze!
  • REKLAMA
  • #9 2271661
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    No właśnie binarnie. Tekstowo jest tylko ta zmienna wysylana. Jak do TextBox'a ładowałem zawartość bufora przychodzącego:
    Text1.Text=MSComm1.Input

    to w texboxie pojawiało sie:

    zmienna1|zmienna2|

    A jak czytam teraz wartość Text1.Text=Val(MSComm1.Input) to pokazuje sie:

    zmienna1zmienna2

    czyli wychodzi że binarnie jest ta 13.
  • Pomocny post
    #10 2272917
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    To super.

    Pozniej to sobie przerobisz po swojemu (np zeby dzielilo bezposrednio z portu).

    najbardziej przejzyscie moim zdaniem bedzie tak.
    Zrobimy sobie zmienna ktora bedzie przechowywala wartosc zczytana z rs'a, liczniki, zmienna, ktora bedzie przechowywala kolejne dane i tymczasowy string.

    Dim DaneRs as string
    Dim i as byte
    Dim Count as byte
    Dim Wynik(5) as string
    Dim Temp as string

    DaneRs = MSComm1.Input '(czyli "zmienna1|zmienna2|")

    for i 1 to len(DaneRs) '(czyli tyle razy ile znakow maja dane z rs'a)
    Temp = mid(daneRs, i, 1)
    if Temp = Chr(13) then
    Count = Count + 1
    else
    Wynik(Count) = Wynik(Count) & Temp
    end if
    next i


    Po takim zabiegu zmienna Wynik powinna wypelnic sie kolejno, kolejnymi danymi .

    i teraz kolejno lub w petli np
    TextBox1.text = wynik(0)
    itd

    pozdr.
  • #11 2273119
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Działa wyśmienicie !! :D

    Wielkie dzięki za pomoc :) Jest to o co mi chodziło :) Temat można uznać za zamknięty :wink:

    Dodano po 44 [minuty]:

    Jednak nie do końca dobrze :(

    Tzn. rozbijanie na poszczegolne textboxy działa bardzo dobrze :) Ale niestety jak:

    - zmienna1<10 to jest OK
    - 10<=zmienna1 <100 to wartość w pierwszym TextBoxie nie jest
    wyświetlana pozostale się zwiekszają i wyświetlane jest tylko 4 zmienne z 5
    wysyłanych
    - 100<=zmienna1<1023 - wartości w textboxach migają i nie jest wyświetlana 5 zmienna

    - 1000<=zmienna1<=1023 - wyświetlane są tylko 3 pierwsze zmienne, piersza miga, w drugiej i w trzeciej trzy pierwsze cyfry są stabilne a czwarta miga
    :(

    Czy to wina programu czy raczej coś nie tak z transmisją? Probowałem na 2400, 9600, 19200 i takie same objawy na każdej :(

    Dodano po 1 [godziny] 1 [minuty]:

    Postanowilem sprawdzić po kolei gdize moze byc blad i jest tak, że jeżeli sterownik wysyla do komputera 1 lub dwie zmienne to dziala dobrze. Jezeli ustawie żeby sterownik przesylal do urzadzenia 3 zmienne to juz sie zaczyna problem. Jak wartość zmienna1 jest mniejsza od 1000 to jest dobrze, natomiast jak ta wartość jest równa bądź wieksza od 1000 to program takjakby przesuwal calosc o jedno miejsce w tablicy, czyli zmienna1 laduje pod Wynik(1), zmienna2 pod Wynik(2), zmienna3 pod Wynik(3). Dla wartości zmiennej1 mniejszych od 1000 lądują poprawnie pod Wynik(0), wynik(1) oraz Wynik(2).

    A robie to tak:

    
    
    Private Sub MSComm1_OnComm()
        Dim DaneRs As String
        Dim i As Byte
        Dim Temp As String
        Dim Wynik(5) As String
        Dim Count As Integer
        DaneRs = MSComm1.Input '(czyli "zmienna1|zmienna2|")
    
        For i = 1 To Len(DaneRs) '(czyli tyle razy ile znakow maja dane z rs'a)
        Temp = Mid(DaneRs, i, 1)
        If Temp = Chr(13) Then
        Count = Count + 1
        Else
        Wynik(Count) = Wynik(Count) & Temp
        End If
        Text1 = Wynik(0)
        Text2 = Wynik(1)
        Text3 = Wynik(2)
        Text4 = Wynik(3)
        Text5 = Wynik(4)
        Next i
    
    End Sub
    
    
  • #12 2273931
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Private Sub MSComm1_OnComm() 
        Dim DaneRs As String 
        Dim i As Byte 
        Dim Temp As String 
        Dim Wynik(5) As String 
        Dim Count As Integer 
        DaneRs = MSComm1.Input '(czyli "zmienna1|zmienna2|") 
    
        For i = 1 To Len(DaneRs) '(czyli tyle razy ile znakow maja dane z rs'a) 
        Temp = Mid(DaneRs, i, 1) 
        If Temp = Chr(13) Then 
        Count = Count + 1 
        Else 
        Wynik(Count) = Wynik(Count) & Temp 
        End If 
        Next i 
    
        Text1 = Wynik(0) 
        Text2 = Wynik(1) 
        Text3 = Wynik(2) 
        Text4 = Wynik(3) 
        Text5 = Wynik(4) 
    
    End Sub 
  • REKLAMA
  • #13 2273980
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Niestety danie za pętle nie daje nic bo jak dam sprawdzanie jakie znaki przychodzą:
    Label2 = Asc(DaneRs)
    To powyżej 10 pojawia się na początku 13 a nie wartość zmiennej.

    w sterowniku jest tak:

    
    void wyslij_dane(void)
    {
    	USART_put_text(bufor1);
    	USART_Transmit(13);	
    	USART_put_text(bufor2);
    	USART_Transmit(13);	
    	USART_put_text(bufor3);
    	USART_Transmit(13);	
    
    }
    


    I procedura wyslij_dane(); jest wywoływane na każde przyjście "W" od komputera.

    Czyli wychodziłoby że jest dobrze wysyłane... czyżby sobie VB nie mógł poradzić z takim czymś? :(
  • #14 2274215
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    :) :) Zapewniam Cie ze to nie jest wina VB !

    Jakie dane sa na porcie takie otrzymujesz i czy to bedzie inny jezyk programowania czy inny system uklad UART odbiera dane i przekazuje je dalej.

    Do wizualizacji zrob sobie duzego textboxa i ustaw multiline na true.
    tam wyswietl zmienna DaneRs.

    jezeli chcesz dokladnie zobaczyc jakie bajty przychodza na port wyswietl labela w petli Asc(kazdy bajt po kolei).

    Jesli chodzi o poprawke w kodzie to z samej zasady dzialania wypelnianie textboxow ma byc za petla.

    Jak uzyjesz np hyperterminala i tez odbierzesz wiecej danych to jest ok czy sa krzaczki?

    Jezeli jest ok to problem jest w sposobie odczytywania danych.
    Na jaka wartosc ustawiony jest teraz InputLen?
    Podejrzewam ze jak jest niepazysta liczba danych to ostatnia (akurat 13) przechodzi do nastepnego odczytu.

    Ze wzgledu ze niewiadomo jakiej dlugosci ciagu danych mozemy sie spodziewac proponuje zmienna DaneRs zmienic na Publiczna na poczatku modulu jak jest Public DaneRs as string lub na poczatku listingu formatki Dim DaneRs as string.
    Inputlen ustawic na 1
    wprowadzic zmiany tak jak ponizej
    i pamietac ze podczas wyslania rozkazu zmienna DaneRs musi byc wyczyszcona (DaneRs = "")

    Jeszcze jest jedna sprawa co do Timerow wysylajacych dane.
    Jezeli chcesz ich urzywac musisz zrobic np zmienna publiczna NoSendData typu boolean ktora na czas odbierania danych przyjmie wartosc True i nie pozwoli wyslac Timerowi komendy do ukladu ktory wlasnie wysyla Dane.


    Private Sub MSComm1_OnComm()
    '(Dim DaneRs As String)
    Dim i As Byte
    Dim Temp As String
    Dim Wynik(5) As String
    Dim Count As Integer
    DaneRs = DaneRs & MSComm1.Input '(czyli "zmienna1|zmienna2|")

    For i = 1 To Len(DaneRs) '(czyli tyle razy ile znakow maja dane z rs'a)
    Temp = Mid(DaneRs, i, 1)
    If Temp = Chr(13) Then
    Count = Count + 1
    Else
    Wynik(Count) = Wynik(Count) & Temp
    End If
    Next i

    Text1 = Wynik(0)
    Text2 = Wynik(1)
    Text3 = Wynik(2)
    Text4 = Wynik(3)
    Text5 = Wynik(4)

    End Sub


    P.S kod powinien dzialac tak jak w zamierzeniu. Ma jeden mankament ze wykonuje sie nipotrzebnie zaczesto ale to poprawimy pozniej :)
  • #15 2274954
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    Nadal niestety jest źle, ale co zaobserwowałem to:


    W sterowniku mam zadeklarowane:

    zmienna2=zmienna1+1
    zmienna3=zmienna1+2
    zmienna4=zmienna1+3
    zmienna5=zmienna1+4

    Zrobiłem że znak jest wysyłany tylko w przypadku naciśnięcia przycisku a nie jak wcześniej timerem. Wartość zmiennej DaneRs jest wyświetlana w textboxie. Opcja multiline nie powoduje wrzucenie do następnego wiersza. Dane są wyświetlane w jednej linii.

    Jeżeli zmienna1 jest mniejsza od 10 to trzeba dwa razy wysłać polecenie do sterownika żeby dobrze odczytał bo raz nie wystarczy (chyba o tym pisałem wyżej)

    Jeżeli zmienna1 jest większa lub równa 10 to wystarczy raz wysłać, a jak się wyśle dwa razy lub więcej to ładuje sie 13 na początek ciągu.

    Jeżeli zmienna1 jest równa 96 to pojawia sie 0|

    Jeżeli zmienna1 jest równa 97 to pojawia sie 01|

    Jeżeli zmienna1 jest równa 98 to pojawia sie 102|

    Jeżeli zmienna1 jest równa 99 to pojawia sie |103|


    Jeżeli zmienna 1 jest większa lub równa 100 (np.104) to wystarczy raz wysłać polecenie do sterownika ale ładują się: 7|108|

    Jeżeli zmienna1 jest równa 997 to pojawia sie 00|1001|

    Jeżeli zmienna1 jest równa 998 to pojawia sie 001|1002|

    Jeżeli zmienna1 jest równa 999 to pojawia sie 1002|1003|

    Jeżeli zmienna1 jest równa lub większa 1000 (np.1002) to pojawiają się dane sie |1005|1006|

    Dodatkowo jest tak gdy zmienna1>=96 to jest tak jakby ladowal sie do tego textboxa w ktorym wyswietlam DaneRS cały ciąg i był obcinany do tych wartości co wyżej napisałem :roll:. Ładuje się na ułamek sekundy całość i jest obcinana :|


    Jeżeli ustawie ze sterownika wyśyle:

    zmienna1 10 13 zmienna2 10 13 zmienna3 10 13 zmienna 4 10 13 zmienna5 10 13

    żeby sobie pooglądać w HyperTerminalu to mi się wyświetlają jedna pod drugą i jest poprawnie , bez przesunięć czyli to kwestia odczytu w moim programie raczej. A jak jest wyslana sama 13 po zmiennej to wyswietlana jest ostatnia zmienna tylko w terminalu. Ale też jak się trzyma wciśnięte "W" to gdy zmienna jest mniejsza od 10 to wyswietlana jest ostatnia (zmienna5) i odczyt nie migocze, a dla większych to zawsze ostatnia cyfra
    miga :( No ale to tylko wtedy jak przesyłane jest ze strownika:

    dana1,13,dana2,13,dana3,13,dana4,13,dana5

    bo jak dodatkowo oprocz 13 wysle 10 to jest rozbijane na 5 linijek w terminalu i w kazdej linii oddzielna zmienna.

    Co do MSComm1.InputLen to nie mam wogóle zadeklarowanego bo jak bym nie zadeklarował, np. MSComm1.InputLen = 1 to wyświetlana jest ostatnia cyfra zmiennej5, np. dla zmienna5 = 1002, wyświetlane jest w w pierwszym textboxie samo 2. W pozostałych textboxach nie jest nic wyświetlane.
  • #16 2275108
    sivex
    Poziom 27  
    Posty: 815
    Pomógł: 113
    Ocena: 25
    Szkoda ze nie mam tego u siebie na stole :)

    Zaczne od konca.
    Jezeli nie masz ustawione inputlen to masz napewno po prawej stronie we wlasciwosciach.
    Jezeli zmienisz inputlen na jeden i wyswietla ci ostatnia wartosc podejrzewam ze nieadeklarowales aadanears jako publicznej lub nie zrobiles zmiany
    DaneRs = DaneRs & MSComm1.Input

    Musisz odczytywac dane po jednym bajcie i ladowac do zmiennej publicznej DaneRs i czyscic ja przed kazdym wyslaniem "W" bo inaczej klapa poniewaz nie znasz dlugosci danych jakie przyjda na port.
  • #17 2275151
    snow
    Poziom 31  
    Posty: 1825
    Pomógł: 178
    Ocena: 201
    No rzeczywiscie, brak było deklaracji jako globalna.

    Teraz mam ze mi 13 ląduje na poczatku DaneRS, czyli zostanie mi wyciać tą 13 z przodu i powinno być ok :)

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z poprawnym odczytem i wyświetlaniem zmiennych przesyłanych przez port RS w aplikacji napisanej w Visual Basic 6. Autor sterownika wysyła zmienne o wartościach z zakresu 1-1023, które są odbierane w programie komputerowym i wyświetlane w kontrolkach TextBox. Problemy obejmują powtarzające się znaki przy wysyłaniu wartości jednocyfrowych, błędne wyświetlanie wartości dwucyfrowych i migotanie danych przy większych liczbach. Wskazano, że dane są przesyłane jako tekst zakończony znakiem ASCII 13 (CR), który służy jako separator zmiennych. Zaproponowano rozwiązanie polegające na odczycie danych z portu w zdarzeniu OnComm, buforowaniu ich w zmiennej globalnej i rozdzielaniu na poszczególne wartości na podstawie znaku CR. Wskazano również na konieczność ustawienia właściwości MSComm.InputLen na 1, aby odczytywać dane bajt po bajcie i unikać problemów z fragmentacją danych. Problemy z synchronizacją i pojawianiem się znaku CR na początku bufora wynikają z braku czyszczenia bufora przed wysłaniem polecenia do sterownika. Ostatecznie poprawne zarządzanie buforem i rozdzielanie danych na podstawie separatora pozwala na stabilne wyświetlanie wartości w oddzielnych TextBoxach, choć nadal wymaga uwagi przy większych liczbach i wielokrotnym wysyłaniu poleceń.
Wygenerowane przez model językowy.
REKLAMA