Forum Coders' city Strona Gwna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UytkownicyUytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj si, by sprawdzi wiadomociZaloguj si, by sprawdzi wiadomoci   ZalogujZaloguj 

Potrzebuj szybkiej odpowiedzi na moje pytanie... Zasady

Odczyt danych z portu RS232



 
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Visual Studio: C#, VB, VC++, …
Zobacz poprzedni temat :: Zobacz nastpny temat  
Autor Wiadomo
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Czw Maj 23, 2019 1:19 pm  OP    Temat postu: Odczyt danych z portu RS232 Odpowiedz z cytatem Pisownia

Mam problem z odczytem danych z portu RS 232. Wysyanie danych do portu dziaa bez problemu jednak przy odbieraniu nic mi nie odczytuje. Parametry portu s poprawne poniewa przy uyciu innych programw odczytuj dane z portu. Poniej zamieszczam kod. Port otwieram drugim przyciskiem wic jest na pewno otwarty.
Kod:

Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click

        Try

            SerialPort1.ReadTimeout = 10000
            Do

                Dim Incoming As String = SerialPort1.ReadLine
                If Incoming Is Nothing Then
                    Exit Do
                Else
                    lblDane.Text = SerialPort1.ReadLine
                End If
            Loop
        Catch ex As TimeoutException
            lblDane.Text = "Error: Serial Port read timed out."
        Finally
            If SerialPort1 IsNot Nothing Then SerialPort1.Close()
        End Try


    End Sub


Miaem bd w programie nadajcym dane do portu poniewa do cigu znakw nie dodaem koca linii.
Jak mog odczyta dane z portu jeeli urzdzenie nie przesya znaku koca linii, metoda
Kod:
ReadLine
wtedy nie dziaa, a z pozostaych dostpnych dziaa tylko
Kod:
ReadChar

[/code]
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
arturooo3
Moderator


Doczy: 04 Lis 2006
Posty: 1190
Skd: Krakw

PostWysany: Pon Maj 27, 2019 9:38 am      Temat postu: Odpowiedz z cytatem Pisownia

Nie wiem czy duo pomog, poniewa w VB nie siedz ju od dobrych kilku lat, ale generalnie w przypadku RS232 dobr metod jest czytanie znak po znaku i skadanie wiadomoci rcznie. W razie otrzymania jednego ze znakw kontrolnych bdziesz mg odpowiednio zareagowa.

Jeeli urzdzenie z ktrym rozmawiasz nie przesya znaku line feed, carriege return lub ani jednego z nich to moe w inny sposb informuje o kocu wiadomoci?
https://en.wikipedia.org/wiki/Control_character
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email Odwied stron autora
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Wto Maj 28, 2019 12:27 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Wydaje mi si e nie nadaje znaku koca linii poniewa w kadym programie jak odbieram dane z urzdzenia to nowa paczka nie jest wstawiana w nowej linii ani za danymi poprzednimi tylko w miejsce ostatniej danej z poprzedniego cigu. Zawsze ostatnia dan z paczki trac. W Lab View napisaem program, w ktrym do kadej paczki dodaje znak nowej linii i wtedy dane wygldaj tak jak powinny. Dodatkowo wg producenta kada dana w paczce jest rozdzielona tabulatorem, w rzeczywistoci s to spacje i miedzy pierwsz i drug dan jest 6 spacji, miedzy drug i trzeci 5, midzy trzeci i czwart 7 i midzy kad kolejn 4.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Pon Cze 03, 2019 9:29 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Mam jeszcze jeden problem. Odczyt danych z portu RS232 realizuj w zdarzeniu "Click" przycisku 1. Potrzebuj drugim przyciskiem zakoczy odczyt danych z portu, ale nie mog tego zrobi dopki trwa operacja w pierwszym. Czy jest moliwo odwoania si do zdarzenia "Click" przycisku drugiego w przycisku pierwszym, czy bardziej poprawny sposb to wykorzystanie wtkw?
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8314
Skd: Toru

PostWysany: Pon Cze 03, 2019 9:51 pm      Temat postu: Odpowiedz z cytatem Pisownia

Przykad:
Kod:
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        'Tu jest kod zdarzenia Click tego przycisku czyli Buttona1
        'a po jego zakoczeniu moesz z poziomu tego zdarzenia wywoa zdarzenie Click Buttona2:  
        Button2.PerformClick()

    End Sub

_________________
Nie zadawaj bezcelowych pyta / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Wto Cze 04, 2019 10:44 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

Troch niejasno si sprecyzowaem.
Potrzebuj drugim przyciskiem zakoczy dziaanie ptli w zdarzeniu przycisku pierwszego.
Nie wiem jak sprawdzi czy zosta kliknity drugi przycisk. Niestety standardowo nie mog nic klikn dopki jest wykonywana ptla w przycisku 1.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8314
Skd: Toru

PostWysany: Wto Cze 04, 2019 7:35 pm      Temat postu: Odpowiedz z cytatem Pisownia

No wic proponuj tak:
zadeklaruj sobie na poziomie moduu zmienn typu Boolean, na przykad o nazwie Przerwij i nadaj jej warto False.
Ptla w zdarzeniu Click przycisku pierwszego niech si wykonuje tak dugo, pki warto zmiennej Przerwij nie zmieni si na True.
Ty moesz klikniciem w drugi przycisk w kadej chwili zmieni warto zmiennej Przerwij na True. Wwczas w ptli w zdarzeniu przycisku pierwszego zostanie to wykryte i zostanie ona przerwana.

_________________
Nie zadawaj bezcelowych pyta / Windows 8.1 / Windows 10 / VB2008 / VB 2010 / VB 2012 / Pisz poprawnie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Wto Cze 04, 2019 9:10 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Niestety ten sposb nie dziaa poniewa dopki trwa zdarzenie przycisku odbierania danych to program nie reaguje, nie mog wcisn innego przycisku. Mam jeszcze problem z zapisem do pliku gdy dane w pliku nie pojawiaj si od razu a dopiero po jakim czasie i nie wiem dlaczego. W pliku tekstowym tez pojawiay si po jakim czasie ale pomogo refresh.
Poniej zamieszczam kod.

Kod:
Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click


        Dim objStreamWriter As StreamWriter

        PRZERWIJ = False

        objStreamWriter = New StreamWriter("C:\Testfile.txt")

        While PRZERWIJ = False


            Dim incoming As String = SerialPort1.ReadChar

            Try

                SerialPort1.ReadTimeout = 15000
                Do

                    If incoming Is Nothing Then
                        Exit Do


                    ElseIf incoming = Chr(13) Then

                        incoming = Chr(incoming) & Chr(10)
                        tbxDane.Text = tbxDane.Text & incoming
                        objStreamWriter.Write(incoming & Chr(10))
                        Refresh()

                    Else

                        incoming = Chr(incoming)
                        tbxDane.Text = tbxDane.Text & incoming
                        objStreamWriter.Write(incoming)
                        Refresh()

                    End If

                Loop
            Catch ex As TimeoutException
                incoming = "Error: Serial Port read timed out."
            Finally
                If SerialPort1 IsNot Nothing Then SerialPort1.Close()
            End Try

        End While

        objStreamWriter.Dispose()
        objStreamWriter.Close()

    End Sub
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
GregoryyyR



Doczy: 03 Pa 2012
Posty: 32

PostWysany: Czw Cze 06, 2019 2:43 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Problem udao si rozwiza poprzez wyodrbnienie nasuchiwania portu do osobnego wtku

Kod:
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

        Dim incoming As String = SerialPort1.ReadChar

        If StatusPortu = True Then
            Try

                SerialPort1.ReadTimeout = 5000
                Me.Invoke(New UpdateFormTextDelegate(AddressOf UpdateFormText), incoming)

            Catch ex As Exception
                incoming = "Error: Serial Port read timed out."
            End Try

        End If

    End Sub


a otwarcie i zamknicie portu realizowane przez przyciski
Kod:
Private Sub btnCzytaj_Click(sender As Object, e As EventArgs) Handles btnCzytaj.Click

        StatusPortu = True
        If SerialPort1.IsOpen = False Then
            SerialPort1.Open()
        End If

    End Sub

Private Sub btnStop_Click(sender As Object, e As EventArgs) Handles btnStop.Click

        StatusPortu = False
        SerialPort1.Dispose()
        SerialPort1.Close()

    End Sub


Oczywicie kod wymaga doprecyzowania, ale program si nie zawiesza i w kadej chwili mona przerwa i wznowi odczyt z portu
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
Wywietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Visual Studio: C#, VB, VC++, … Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Moesz pisa nowe tematy
Moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Moesz dodawa zaczniki na tym forum
Moesz pobiera pliki z tego forum




Debug: strone wygenerowano w 0.17765 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |