SerialPort.Read [Lese nur Byte 1 & 2, dann zeige Wert in Textbox]

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    SerialPort.Read [Lese nur Byte 1 & 2, dann zeige Wert in Textbox]

    Hallo zusammen,

    Ich habe ein Steuermodul, dass über USB mit meinem PC kommuniziert.
    Der Treiber Simuliert einen COM-Port und übersetzt demnach die Signale nach USB.

    Man kann dann in VB ganz normal über einen SerialPort mit dem Gerät kommunizieren.

    Das Gerät schickt mir nach einem bestimmten Befehl 3 Bytes zurück, wobei nur die ersten 2 für mich interessant sind.


    Nun meine Frage :?: :
    Wie lese ich diese 2 Bytes aus, und lasse sie mir anschließend in einer Textbox anzeigen?

    Hier vllt. noch zur Info, Die 3 Bytes sind alle im Hex-Format.



    Danke im Vorraus ,
    TRiViUM

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Probier es mal so:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() bla())
    3. End Sub
    4. Private Sub bla()
    5. Dim ToRead As Integer = SerialPort1.BytesToRead
    6. If ToRead > 0 Then
    7. Dim Buffer(ToRead - 1) As Byte
    8. SerialPort1.Read(Buffer, 0, ToRead)
    9. TextBox1.Text = String.Format("{0:X2} {1:X2}", Buffer(0), Buffer(1))
    10. End If
    11. End Sub

    TRiViUM schrieb:

    Hier vllt. noch zur Info:
    Es kommen Bytes oder ein String an, ob die Bytes oktal, dezimal, duodezimal, hexadezimal oder hexagesimal angezeigt werden, ist eine reine Darstellungsfrage und hat mit der Übertragung nichts zu tun.
    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!
    Vielen Dank, genau so sollte es aussehen :thumbsup:

    Das mit der Formatierung bezüglich Hexadezimal, Dezimal usw. hab ich mir schon gedacht, aber lieber info zu viel als zu wenig ^^



    Eine Frage zum Buffer noch, wieso schriebt man "-1" bei dieser Zeile:

    VB.NET-Quellcode

    1. Dim Buffer(ToRead - 1) As Byte



    Und Danke nochmals :)

    TRiViUM schrieb:

    wieso schriebt man "-1" bei dieser Zeile:
    Das ist historisch, weil ganz früher in VB (nicht .NET) die Felder mit dem Index 1 begannen, danach gab es eine

    VB.NET-Quellcode

    1. Option Base 0 ' oder 1
    . Damit die Programme kompatibel sind, wird in VB ein Feld so angelegt, dass es mit 0 und mit 1 als Startindex laufen würde.
    In C# stünde da:

    Quellcode

    1. Byte[] Buffer = new Byte[ToRead]
    das geht dann von 0 bis (ToRead - 1)
    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!
    Aah, okay, wieder was dazu gelernt :)

    Also diese 2 Bytes sind Spannungswerte, die um sie zu lesen noch in Dezimal umgewandelt werden müssen.
    Ich hatte da schon ein paar wilde Formeln, die aber keinen Sinn ergaben.

    Hatte auch eine Funtion gefunden, allerdings auch für ein etwas historischeres VB als 2012.

    hat da jemand einen gescheiten ansatz ?

    TRiViUM schrieb:

    die um sie zu lesen noch in Dezimal umgewandelt werden müssen.
    Was sagt das Handbuch der Hardware dazu?
    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!

    TRiViUM schrieb:

    hat da jemand einen gescheiten ansatz ?

    Nein. Wie willst du denn ein Byte in "Dezimal umwandeln"? Die einzige Frage ist, ob die 2 Byte ZWEI Werte darstellen oder nur einen? Wenn es nur EIN Wert ist, musst du nur wissen, welches Byte das höherwertige ist und der "Dezimalwert" ist dann ByteA * 256 + ByteB. Oder Alternativ: i as Integer = (CInt(ByteA) << 8 OR CInt(ByteB))
    Okay gut. Also das Handbuch der Hardware sagt da drüber gar nix. Es war lediglich die info, dass das Byte1 der High-Wert der Messung, und Byte2 der Low-Wert der Messung ist.

    Das ganze ist aber 1 Wert, bzw. EINE Zahl.


    Zur Info: Hardware ist HB628 von H-Tronic.

    Das mit ByteA * 256 + ByteB hab ich auch schon gelesen, nur zudem zeitpunkt musste ich die Bytes erstmal in HEX anzeigen. Jetzt kann ich ja nochmal ein wenig code schreiben :)

    EDIT:

    So hat alles funktioniert:

    VB.NET-Quellcode

    1. Dim ToRead As Integer = SP.BytesToRead
    2. If ToRead > 0 Then
    3. Dim Buffer(ToRead - 1) As Byte
    4. SP.Read(Buffer, 0, ToRead)
    5. Dim HighByte As String = Buffer(0)
    6. Dim LowByte As String = Buffer(2)
    7. MsgBox(HighByte * 256 + LowByte) 'Spannung in mV
    8. EmpfangsTextbox.Text = String.Format("{0:X2} {1:X2}", Buffer(0), Buffer(1)) 'Zeigt die beiden Bytes in HEX an
    9. End If


    Aber wenn ich einen Online HEX-TO-DEC anschmeiße, kommt bei der Zahl immer einer zu wenig raus :D

    also laut dem Code kommt dann eine MsgBox mit dem Wert 235, aber der online-converter gibt 236 aus. Was ist denn da genauer?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „TRiViUM“ ()

    TRiViUM schrieb:

    Das mit ByteA * 256 + ByteB hab ich auch schon gelesen
    Und warum machst Du es dann nicht?

    VB.NET-Quellcode

    1. Dim MeinWert As Integer = 256 * Byte(0) + Byte(1)
    und fertich. :D
    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!

    TRiViUM schrieb:

    kommt dann eine MsgBox mit dem Wert 235

    VB.NET-Quellcode

    1. Dim HighByte As String = Buffer(0)
    2. Dim LowByte As String = Buffer(2) ' das hier
    Sollte das nicht Buffer(1) heißen?
    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!
    Funktioniert es nun oder gibt es noch Probleme?
    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!
    Also mit diesem Code

    VB.NET-Quellcode

    1. Dim ToRead As Integer = SP.BytesToRead
    2. If ToRead > 0 Then
    3. Dim Buffer(ToRead - 1) As Byte
    4. SP.Read(Buffer, 0, ToRead)
    5. Dim HighByte As String = Buffer(0)
    6. Dim LowByte As String = Buffer(1)
    7. EmpfangsTextbox.Text = String.Format("{0:X2} {1:X2}", Buffer(0), Buffer(1)) 'Zeigt die beiden Bytes in HEX an
    8. MsgBox(HighByte * 256 + LowByte) 'Spannung in mV
    9. End If


    funktioniert es jetzt auch mit der Gleichheit des Online-Converters. Danke nochmal ;)


    Noch eine Frage zum Abschluss:
    Das Gerät hat insgesamt 8 analoge Eingänge. Diese kann ich alle mit 1 Befehl auf einmal abfragen.

    Dann bräuchte ich aber nit für jedes Byte n neuen Buffer erstellen, sondern es würde reichen, wenn ich die Bytes dann mit Buffer(1), Buffer(2) etc. trenne, richtig ?
    Wenn BytesToRead entsprechend groß ist und wenn die Zuordnung
    Byte 0+1 - 1. Gerät
    Byte 2+3 - 2. Gerät
    oder
    Byte 3+4 - 2. Gerät
    oder so ist.
    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!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „RodFromGermany“ () aus folgendem Grund: Korrektur Benennung "2. Gerät"

    Alles klar.
    Also das Gerät schickt mir dann Jeweils Pro Eingang 3 Bytes. Also 8 Eingänge x 3 Bytes, wobei auch hier wieder das 3. Byte von jedem Eingang uninteressant ist.

    Da werde ich mal ein bisschen experimentieren, aber bis hier hin danke danke danke :*