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.22204 sekund, zapytan = 11
contact

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