HEX-Werte an RS232 Schnittstelle auslesen

  • VB.NET

Es gibt 57 Antworten in diesem Thema. Der letzte Beitrag () ist von iOS78.

    HEX-Werte an RS232 Schnittstelle auslesen

    Hallo VB-Gemeinde,

    ich habe ein kleines Problem.
    Ich möchte aus einem Stromzähler Verbrauch, Wirkleistung, etc. auslesen. Dazu habe ich mir eine Fotodiode an ein RS232 Kabel gebastelt.
    Mit hTerm sieht der Datenstrom so aus:


    Jetzt hab ich mir mit VB ein Testprogramm gebaut, mit dem ich genau diesen Datenstrom darstellen möchte. Allerdings werden hier nur Fragezeichen und ab und zu ein paar undefinierbare Zeichen dargestellt:



    Wie kann ich die Ausgabe wie in hTerm hinbekommen?

    Hier der Code:

    VB.NET-Quellcode

    1. Option Explicit On
    2. Public Class Form1
    3. 'Com-Port öffnen - hier: COM2
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btn_open.Click
    5. Try
    6. SerialPort1.Open()
    7. btn_close.Enabled = True
    8. Catch ex As Exception
    9. MsgBox("Verbindung fehlgeschlagen")
    10. End Try
    11. End Sub
    12. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    13. Me.Invoke(Sub() TextBox3.AppendText(SerialPort1.ReadExisting))
    14. End Sub
    15. Private Sub btn_close_Click(sender As System.Object, e As System.EventArgs) Handles btn_close.Click
    16. SerialPort1.Close()
    17. btn_close.Enabled = False
    18. End Sub
    19. End Class



    Schonmal vielen Dank für Eure Hilfe!!!!

    iOS78 schrieb:

    hinbekommen
    Füge mal vor Open() dies ein:

    VB.NET-Quellcode

    1. SerialPort1.Encoding = System.Text.Encoding.UTF8
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @iOS78 was sagt denn die Dokumentation, was da ankommen soll?
    Und mach dies:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim txt = SerialPort1.ReadExisting
    3. Me.Invoke(Sub() TextBox3.AppendText(txt))
    4. End Sub
    Setze auf Me.Invoke() einen Haltepunt und sieh Dir die Variable txt an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi,

    die Doku sagt nicht viel. Ist ein SML-Code, der bei allen Stromzählern verwendet wird. Dieser Code sieht in hTerm als HEX so aus, wie oben gesehen.

    Setze auf Me.Invoke() einen Haltepunt und sieh Dir die Variable


    Keine Daten in der Textdatei.

    iOS78 schrieb:

    Keine Daten in der Textdatei.
    ???

    RodFromGermany schrieb:

    sieh Dir die Variable txt an.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Guckt euch doch mal den ersten Screenshot an und dann den zweiten. Da kommt kein Text an und er möchte einfach nur die Bytes empfangen und als HEX Formatierte Liste anzeigen...

    VB.NET-Quellcode

    1. Dim bytes(serialPort.BytesToRead-1) As Byte
    2. serialPort.Read(bytes,0,bytes.Length)

    Jetzt hast du ein Byte-Array, nurnoch das Byte Array in deinen formatierten String konvertieren.
    So konvertierst du ein einzelnes Byte:

    VB.NET-Quellcode

    1. Dim b As Byte = 123
    2. Dim hexStr As String = b.ToString("X2")


    Nurnoch kombinieren und etwas selbst tüfteln
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    @jvbsl Jou.
    @iOS78 Ist gesichert, dass Strings ankommen
    oder
    könnten auch Bytes ankommen?
    Deswegen die Frage nach der Doku.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi!

    erstmal Danke für die rege Teilnahme!

    @'RodFromGermany: eher Bytes, aber ich häng das Programm gleich mal direkt an den Zähler. Mal sehen, was er ausspu

    @'jvbsl': stehe gerade total auf dem Schlauch und weiß nicht, wo ich Deinen 1. Codevorschlag einbinden soll.....

    iOS78 schrieb:

    einbinden soll.....
    in die Routine SerialPort1_DataReceived(...).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    iOS78 schrieb:

    Hex-String?
    Poste mal Deinen aktuellen Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Poste mal Deinen aktuellen Code.


    VB.NET-Quellcode

    1. Public Class Form1
    2. Public Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    3. Dim bytes(SerialPort1.BytesToRead - 1) As Byte
    4. Me.Invoke(Sub() TextBox3.AppendText(SerialPort1.BytesToRead - 1))
    5. End Sub
    6. 'Com-Port öffnen - hier: COM2
    7. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles btn_open.Click
    8. Try
    9. SerialPort1.Encoding = System.Text.Encoding.Default
    10. SerialPort1.Open()
    11. btn_close.Enabled = True
    12. Catch ex As Exception
    13. MsgBox("Verbindung fehlgeschlagen")
    14. End Try
    15. End Sub
    16. Private Sub btn_close_Click(sender As System.Object, e As System.EventArgs) Handles btn_close.Click
    17. SerialPort1.Close()
    18. End Sub
    19. End Class
    Was du machen kannst, ist das ByteArray in String wandeln und dann mit ner For Schleife, Step = 2, durchgehen und dann mit Substring(i, 2) und .Append(System.Convert.ToChar(System.Convert.ToUInt32(i, 16)).ToString() wieder verketten
    StackOverflow

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    iOS78 schrieb:

    VB.NET-Quellcode

    1. Me.Invoke(Sub() TextBox3.AppendText(SerialPort1.BytesToRead - 1))
    ist falsch.
    Was genau bedeuten denn die Daten, die da ankommen?
    Du musst sie zuerst in das richtige Format konvertieren.
    Und:
    Hex ist nur eine Stringrepräsentation einer Ganzzahl.
    &HFF = 255
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hi!

    Die Daten, welche vom Zähler erzeugt/ausgegeben werden enthalten Verbrauchswerte. Alle 2 Sekunden wird ein Datenpaket von 768 Zeichen übertragen:

    1B1B1B1B010101017605000C9394620062007263010176010105000431300B090149534B0003BF2736010163D5DB007605000C9395620062007263070177010B090149534B0003BF2736070100620AFFFF7262016500065D7F7A77078181C78203FF010101010449534B0177070100000009FF010101010B090149534B0003BF27360177070100010800FF650000018201621E52FF5900000000000788820177070100010801FF0101621E52FF5900000000000788820177070100010802FF0101621E52FF5900000000000000000177070100100700FF0101621B520055000001FC0177070100240700FF0101621B5200550000000C0177070100380700FF0101621B5200550000014E01770701004C0700FF0101621B520055000000A10177078181C78205FF010101018302C9E61F32D0335C0D81556B35562FB1EE7BBC2CEFEB1FF4B4D311D674D039D68F5276EDFA32E1FCC486FAD17BCF508C26010101634C43007605000C939662006200726302017101631809001B1B1B1B1A00FC251

    In diesem Beispiel ist die Startsequenz rot markiert, die blauen Markierungen bedeuten: 1. Messpunkt 0010800 (Wirkleistung), 2. Einheit 621E (W/h), Messwert 078882 (hex) = 493698 (dec) = 493698 W/h.

    Vielleicht ist auch mein Ansatz grundsätzlich falsch.

    Eigentlich möchte ich ja nur genau diese rohen Daten an der RS232 Schnittstelle auslesen und fortlaufend angezeigt bekommen. Der nächste Schritt wäre dann, den Datenhaufen nach diesen Merkmalen zu durchsuchen und die Werte darszustellen.
    Das wird wohl eher ein Mammutprojekt für nen "Rookie" wie mich.......

    iOS78 schrieb:

    Datenpaket von 768 Zeichen
    Char oder Byte?
    Char kann auch 8 Bit lang sein, das wird über das Encoding des Ports eingestellt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Danke für Dein Interesse mir doch noch zur Lösung zu verhelfen! :thumbsup:

    Habe gerade ein Datenblatt zu meinem Stromzähler gefunden. Hier steht:
    - Baudrate: 9600
    - DataBits: 8
    - StopBits: 1
    - Parity: None

    Mehr find ich leider nicht.
    Der RS232 ist auf jeden Fall richtig eingestellt, da die Datenübertragung mit einem kommerziellen Programm(dessen Testzeitraum leider nun abgelaufen ist) 1A funktioniert hat.

    Vielleicht sagt das einem Profi wie Dir und sicherlich auch einem Haufen anderer hier im Forum aber schon genug? ;)

    LG

    Ingo