Forum Coders' city Strona G³ówna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   U¿ytkownicyU¿ytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj siê, by sprawdziæ wiadomo¶ciZaloguj siê, by sprawdziæ wiadomo¶ci   ZalogujZaloguj 

Potrzebujê szybkiej odpowiedzi na moje pytanie... Zasady

Odczyt danych z portu RS232



 
Odpowiedz do tematu    Forum Coders' city Strona G³ówna -> Visual Studio: C#, VB, VC++, …
Zobacz poprzedni temat :: Zobacz nastêpny temat  
Autor Wiadomo¶æ
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

PostWys³any: 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 programów 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 znaków 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]
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
arturooo3
Moderator


Do³±czy³: 04 Lis 2006
Posty: 1190
Sk±d: Kraków

PostWys³any: 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 znaków kontrolnych b?dziesz móg? odpowiednio zareagowa?.

Je?eli urz?dzenie z którym rozmawiasz nie przesy?a znaku line feed, carriege return lub ani jednego z nich to mo?e w inny sposób informuje o ko?cu wiadomo?ci?
https://en.wikipedia.org/wiki/Control_character
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ Wy¶lij email
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

PostWys³any: 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 którym 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.
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

PostWys³any: 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? dopóki trwa operacja w pierwszym. Czy jest mo?liwo?? odwo?ania si? do zdarzenia "Click" przycisku drugiego w przycisku pierwszym, czy bardziej poprawny sposób to wykorzystanie w?tków?
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
samolot



Do³±czy³: 26 Sty 2006
Posty: 8376
Sk±d: Toru?

PostWys³any: 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
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ Wy¶lij email
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

PostWys³any: 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?? dopóki jest wykonywana p?tla w przycisku 1.
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
samolot



Do³±czy³: 26 Sty 2006
Posty: 8376
Sk±d: Toru?

PostWys³any: 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, póki 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. Wówczas 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
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ Wy¶lij email
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

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

Niestety ten sposób nie dzia?a poniewa? dopóki 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
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
GregoryyyR



Do³±czy³: 03 Pa¼ 2012
Posty: 32

PostWys³any: 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
Powrót do góry
Zobacz profil autora Wy¶lij prywatn± wiadomo¶æ
Wy¶wietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona G³ówna -> Visual Studio: C#, VB, VC++, … Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Mo¿esz pisaæ nowe tematy
Mo¿esz odpowiadaæ w tematach
Nie mo¿esz zmieniaæ swoich postów
Nie mo¿esz usuwaæ swoich postów
Nie mo¿esz g³osowaæ w ankietach
Mo¿esz dodawaæ za³±czniki na tym forum
Mo¿esz 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 |