Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Visual Basic] Kontrloka SerialPort i budowa terminala RS232

klops_mops 06 Sie 2009 01:18 4553 8
  • #1 06 Sie 2009 01:18
    klops_mops
    Poziom 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...

    Code:

        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

    0 8
  • #3 11 Sie 2009 22:44
    one_eddie
    Poziom 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.

    0
  • #4 23 Gru 2009 12:47
    piotr411
    Poziom 22  

    one_eddie napisał:
    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?


    Code:


                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

    0
  • #6 23 Gru 2009 13:58
    piotr411
    Poziom 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()

    0
  • #7 23 Gru 2009 14:47
    arnoldziq
    Moderator Programowanie

    Microsoft napisał:
    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.

    0
  • #8 23 Gru 2009 15:04
    one_eddie
    Poziom 25  

    @arnoldziq: Podałem mu we wcześniejszym poście linka to zdarzenia DataReceived. Chyba nie zauważył :)
    @piotr411: Dobrze doczytaj moją wiadomośc podałem 2 adresy. Drugi bedzie dla Ciebie tym czego szukasz.

    0