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. Wysy?anie danych do portu dzia?a bez problemu jednak przy odbieraniu nic mi nie odczytuje. Parametry portu s? poprawne poniewa? przy u?yciu innych programw odczytuj? dane z portu. Poni?ej zamieszczam kod. Port otwieram drugim przyciskiem wi?c 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


Mia?em b??d w programie nadaj?cym dane do portu poniewa? do ci?gu znakw nie doda?em ko?ca linii.
Jak mog? odczyta? dane z portu je?eli urz?dzenie nie przesy?a znaku ko?ca linii, metoda
Kod:
ReadLine
wtedy nie dzia?a, a z pozosta?ych dost?pnych dzia?a 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 du?o pomog?, poniewa? w VB nie siedz? ju? od dobrych kilku lat, ale generalnie w przypadku RS232 dobr? metod? jest czytanie znak po znaku i sk?adanie wiadomo?ci r?cznie. W razie otrzymania jednego ze znakw kontrolnych b?dziesz mg? odpowiednio zareagowa?.

Je?eli urz?dzenie z ktrym rozmawiasz nie przesy?a znaku line feed, carriege return lub ani jednego z nich to mo?e w inny sposb informuje o ko?cu wiadomo?ci?
https://en.wikipedia.org/wiki/Control_character
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo Wylij email
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 ko?ca linii poniewa? w ka?dym programie jak odbieram dane z urz?dzenia to nowa paczka nie jest wstawiana w nowej linii ani za danymi poprzednimi tylko w miejsce ostatniej danej z poprzedniego ci?gu. Zawsze ostatnia dan? z paczki trac?. W Lab View napisa?em program, w ktrym do ka?dej paczki dodaje znak nowej linii i wtedy dane wygl?daj? tak jak powinny. Dodatkowo wg producenta ka?da dana w paczce jest rozdzielona tabulatorem, w rzeczywisto?ci s? to spacje i miedzy pierwsz? i drug? dan? jest 6 spacji, miedzy drug? i trzeci? 5, mi?dzy trzeci? i czwart? 7 i mi?dzy ka?d? 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 zako?czy? odczyt danych z portu, ale nie mog? tego zrobi? dopki trwa operacja w pierwszym. Czy jest mo?liwo?? odwo?ania si? do zdarzenia "Click" przycisku drugiego w przycisku pierwszym, czy bardziej poprawny sposb to wykorzystanie w?tkw?
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

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

Przyk?ad:
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 zako?czeniu mo?esz z poziomu tego zdarzenia wywo?a? 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? sprecyzowa?em.
Potrzebuj? drugim przyciskiem zako?czy? dzia?anie p?tli w zdarzeniu przycisku pierwszego.
Nie wiem jak sprawdzi? czy zosta? klikni?ty drugi przycisk. Niestety standardowo nie mog? nic klikn?? dopki jest wykonywana p?tla w przycisku 1.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
samolot



Doczy: 26 Sty 2006
Posty: 8376
Skd: Toru?

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

No wi?c proponuj? tak:
zadeklaruj sobie na poziomie modu?u zmienn? typu Boolean, na przyk?ad o nazwie Przerwij i nadaj jej warto?? False.
P?tla w zdarzeniu Click przycisku pierwszego niech si? wykonuje tak d?ugo, pki warto?? zmiennej Przerwij nie zmieni si? na True.
Ty mo?esz klikni?ciem w drugi przycisk w ka?dej chwili zmieni? warto?? zmiennej Przerwij na True. Wwczas w p?tli 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 dzia?a 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 pojawia?y si? po jakim? czasie ale pomog?o refresh.
Poni?ej 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 uda?o si? rozwi?za? poprzez wyodr?bnienie nas?uchiwania portu do osobnego w?tku

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 zamkni?cie 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


Oczywi?cie kod wymaga doprecyzowania, ale program si? nie zawiesza i w ka?dej chwili mo?na 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.22322 sekund, zapytan = 11
contact

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