Probleme mit einlesen von Werten über den SerialPort

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Probleme mit einlesen von Werten über den SerialPort

    Hallo zusammen,

    ich habe ein Beleuchtungsmessgerät, dass mir via RS232 Werte übermitteln soll.

    Wenn ich es über das Hyperterminal anspreche funktioniert es.Aber über mein Programm , dass ich geschrieben habe bekomme ich keine Werte.

    Laut Hersteller muss jeder Befehl mit cr abgeschlossen werten. Der Sendebefehl lautet ST.

    Programmbeispiel:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Empfansstring As StringPrivate Sub Sendebutton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Sendebutton.Click
    3. If SerialPort1.IsOpen = False Then
    4. SerialPort1.Open()
    5. End IfSerialPort1.WriteLine("ST" & vbCr)
    6. End Sub
    7. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    8. Empfansstring = SerialPort1.ReadLine 'hier springt er immer raus, wenn er die Empfangen daten auslesen soll
    9. End Sub
    10. End Class



    Ich habe das Gefühl, dass der Sendebefehl nicht richtig erkannt wird. Ich kann anstatt ST alles mögliche reinschreiben.


    Kann mir jemand helfen?



    Gruß Indeed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ () aus folgendem Grund: Thema verschoben

    Hi

    Indeed schrieb:

    'hier springt er immer raus, wenn er die Empfangen daten auslesen soll
    Was meinst du damit? Wird eine Exception ausgelöst? Mit welcher Fehlermeldung? Was passiert weiter?
    In Welchem Format kommen die Daten zurück? Wenn du ReadLine() benutzt, musst du dem SerialPort auch mitteilen, mit welchem(n) Zeichen eine "NewLine" definiert ist - bei dir anscheinend mit einem cr. VB nimmt standardmäßig vbCrLf an - deswegen erkennt er nicht, dass eine Zeile angekommen ist. Lege also "NewLine" auf den richtigen Wert fest. Teste auch, ob Daten bei Verwendung von ReadByte() ankommen.
    Gruß
    hal2000
    Erst mal danke für deine Antwort. Wie es scheint hat hier niemand wirklich viel Ahnung mit Com-Schnittstellen...

    Ich habe mal deinen Rat befolgt und bin zu folgendem Ergebniss gekommen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim empfang As String
    3. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    4. Try
    5. If Schnittstelle_Schnittstellenerkennung.IsOpen = False Then
    6. Schnittstelle_Schnittstellenerkennung.Open()
    7. End If
    8. Schnittstelle_Schnittstellenerkennung.WriteLine("ST" & vbCr) 'Sendebefehl
    9. Catch ex As Exception
    10. End Try
    11. TextBox1.Text = empfang
    12. End Sub
    13. Private Sub Schnittstelle_Schnittstellenerkennung_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles Schnittstelle_Schnittstellenerkennung.DataReceived
    14. Try
    15. For i As Int32 = 0 To Schnittstelle_Schnittstellenerkennung.BytesToRead ' Alle Bytes einzel lesen und anzeigenDim Incoming As Integer = Schnittstelle_Schnittstellenerkennung.ReadByte 'wenn hier 21 kommt, Steht in meinem Empfangsstring ein gederehtes "T"
    16. If Incoming = 21 Then Exit For
    17. Dim returnStr As String = Chr(Incoming)
    18. empfang = empfang & returnStr
    19. Next
    20. Catch ex As Exception
    21. MsgBox("Fehler bei Messbernahme")
    22. Finally
    23. Schnittstelle_Schnittstellenerkennung.Close()
    24. End TryEnd Sub
    25. End Class


    Das Problem ist nur, dass er mir jetzt den Wert nur einmal anzeigt. Schicke ich ein zweites mal meinen Sendebefehl,dann kommt ein verdrehtes "T".Und bringt nur 21 anstatt 22 bei .readbyte.

    Kann mir jemand sagen wieso das nur einmal funktioniert??

    Gruß
    Imports System.Text ' <=== !
    Das ist wichtig


    Damit kannst du auch senden

    VB.NET-Quellcode

    1. Sub SendSerialData02(ByVal data As String)
    2. Dim enc As Encoding = Encoding.GetEncoding(1252)
    3. ' Send strings to a serial port.
    4. 'Using com1 As IO.Ports.SerialPort = _
    5. ' My.Computer.Ports.OpenSerialPort("COM1", 2400, IO.Ports.Parity.None, 8)
    6. SerialPort1.Encoding = enc
    7. Try
    8. SerialPort1.Write(data)
    9. Catch
    10. MessageBox.Show("Anschluß geschlossen")
    11. End Try
    12. End Sub