Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Visual Basic] Kontrloka SerialPort i budowa terminala RS232

klops_mops 06 Aug 2009 01:18 4952 8
  • #1
    klops_mops
    Level 17  
    Witam.

    Od pewnego czasu uczę się pisać w VB.. Teraz, by wykorzystać potęgę wbudowanego w Atmegi UARTu, chcę sam stworzyć prosty terminal do odbioru i nadawania stringów. Zasada działania ma być bardzo prosta - wszystko co wyśle uC ma być wpisane do pola tekstowego, i analogicznie w drugą stronę (chodź tu zależy jaki program jest napisany na uC, ale nie ważne skupmy się na odbieraniu...). Czemu nie użyje gotowego, dobrze działającego terminala? Dlatego, że pisząc swój dużo się nauczę i będę mógł wykorzystać do przyszłych programów.

    Nadawanie wychodzi mi bez problemu - piszę string, klikam wyślij i leci do uC. Wszystko pięknie..

    Gorzej ma się sprawa z odbieraniem stringów zakończonych znakiem o kodzie 13 (zwykły enter, Chr(13)), używam do odbioru timera, oraz polecenia ReadLine. Niestety gdy uC wyśle cokolwiek zakończonego Chr(13) to cały program na PC łapie zawieszkę.

    Poniżej wycinek odpowiedzialny za odbiór danych (a raczej za próbę odbioru...):
    Oczywiście port został wcześniej skonfigurowany i otwarty...
    
        Dim otrzymane As String
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim Send As Integer
            Send = Form1.SerialPort1.BytesToRead
            If Send > 0 Then
                otrzymane = Form1.SerialPort1.ReadExisting
                RichTextBox1.Text = RichTextBox1.Text + otrzymane
            End If
        End Sub
    


    Szukałem za pomocą Google jakiś informacji na temat sposobów odbierania danych, lecz nie ma ich za dużo...

    Pozdrawiam i z góry dziękuję za pomoc, Wojtek
  • #3
    one_eddie
    Level 25  
    Proponuje odejść od sposobu opartego na Timerze bo tak pisze sie jedynie zle dzialajace aplikacje. Serial port udostepnia odpowiednie zdarzenia informujace o nadejsciu danych i nie trzeba zarzynac sprzętu ciaglym sprawdzaniem IO zeby cokolwiek odebrac.
  • #4
    piotr411
    Level 22  
    one_eddie wrote:
    Proponuje odejść od sposobu opartego na Timerze bo tak pisze sie jedynie zle dzialajace aplikacje. Serial port udostepnia odpowiednie zdarzenia informujace o nadejsciu danych i nie trzeba zarzynac sprzętu ciaglym sprawdzaniem IO zeby cokolwiek odebrac.


    Trochę odkopie temat i zapytam się jakie to polecenie realizuje?


    
    
                dane = SerialPort1.ReadByte()
                zmienna = zmienna & Chr(dane)
    


    przy takim zdarzeniu będzie to wisiało aż coś wejdzie w port

    jak zrobić by to co napisałeś, program wskakiwał w czytanie jeśli coś sie pojawi na com1
  • #6
    piotr411
    Level 22  
    tak znam tę strone

    problem w tym, że stosując

    polecenia:

    - serialport.ReadExisting()
    - serialport.ReadLine()
    - serialport.ReadByte()

    komputer czeka na zank z COMa jesli nie przychodzi to będzie tam "wisiał"
    niema problemu gdy coś jest nadawane do komputera, wtedy oczywiście ramki są poprawne i wszystko działa jak należy

    w Basicu klasycznym jest polecenie inkey() które jesli bark znaku na RS to przechodzi do dalszych zadań
    i własnie tu moje pytanie jeśli nic nie ma na porcie jak zwolnić SeralPort.ReadByte()
  • #7
    arnoldziq
    Moderator of Programming
    Microsoft wrote:
    Dim instance As SerialPort
    Dim handler As SerialDataReceivedEventHandler
    AddHandler instance.DataReceived, handler

    Cała sztuka polega wywołaniu metod czytających port tylko wtedy, gdy cos do odczytania na porcie jest, a nie cały czas, licząc na jakąś zagubioną ramkę danych.
    Musisz zrobić swoją procedurę obsługi zdarzenia SerialDataReceived i np. w tej procedurze odczytywać przychodzące dane.
  • #8
    one_eddie
    Level 25  
    @arnoldziq: Podałem mu we wcześniejszym poście linka to zdarzenia DataReceived. Chyba nie zauważył :)
    @Piotr41: Dobrze doczytaj moją wiadomośc podałem 2 adresy. Drugi bedzie dla Ciebie tym czego szukasz.