Daten byteweise an serielle Schnittstelle übergeben

  • VB.NET

Es gibt 54 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Daten byteweise an serielle Schnittstelle übergeben

    Hallo,

    ich stehe mal wieder vor einem kleinen Problem mit VB... Ich habe ein Programm, das über die serielle Schnittstelle mit einem Gerät kommuniziert. Das Protokoll ist komplett entschlüsselt, ich weiss also was ich schicken muss. Werte werden auch anständig auf ASCII-HEX umgewandelt, wie das Gerät das haben will (z.B. 30 für eine "0"). Die gesamten Befehle habe ich nun verkettet, wie sie zusammengehören. Habe jetzt also einen String mit dem Inhalt "00 51 20 31 30 66" und so weiter... wie kann ich diese Daten nun byteweise hexadezimal auf den COM-Port schicken. Wenn ich jetzt einfach den String an Write übergebe, schicke ich ja den String raus, was dann natürlich nicht funktioniert. Doch wie mache ich es richtig?

    Gruss Daniel
    Mach es so:

    VB.NET-Quellcode

    1. Dim _Encoding As System.Text.Encoding = System.Text.Encoding.Default
    2. Dim text As String = TextBox1.Text
    3. Dim by As Byte() = _Encoding.GetBytes(text)
    4. SerialPort1.Write(by, 0, by.Length)
    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 irgendwie komme ich mit all dem nicht weiter... Nach stundenlangem Google, bin ich der wohl besten Lösung auf die Spur gekommen ;)

    VB.NET-Quellcode

    1. Dim strHex As String = array_mit_allen_befehlen_ans_geraet(i)
    2. Dim lngdezimal As Decimal = CLng("&H" & strHex)
    3. s.Write(lngdezimal, 0, 1)


    Das ganze steht natürlich in einer Schleife und s ist die Schnittstelle. Passt also...

    Dabei bekomme ich aber die Fehlermeldung:

    Spoiler anzeigen
    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Write" mit diesen Argumenten aufgerufen werden kann:
    "Public Sub Write(buffer() As Byte, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.
    "Public Sub Write(buffer() As Char, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Char" konvertiert werden. C:\Dokumente und Einstellungen\blablabla\main.vb 359 17 Anwendungsname


    Wo ist nun mein Fehler? Wie bekomme ich den mgl. einfach weg?
    Welche Datentypen haben die Argumente, die du an die Write-Methode übergibst?
    Byte

    ErfinderDesRades schrieb:

    Welche Datentypen werden verlangt?
    ?( finde ich nix zu... ?(


    Dim lngdezimal(1) As Byte
    Da war der Fehler... Bin ich doof... Ich hatte das nicht als Array sondern als Variable definiert *an die Stirn klatsch*
    Aber laut Port-Sniffer wird immernoch Müll übertragen... Jetzt gilt es den zu finden... :(

    EDIT: Nee... Doof... Ist ja in einer Schleife... Die Variable stimmt ja... Wird ja in jedem Durchlauf neu belegt...
    Aber irgendwie will das garnicht... :( Jetzt habe ich soweit alles, jetzt kommt aber die Fehlermeldung:

    VB.NET-Quellcode

    1. Der Wert vom Typ "Byte" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

    Hää? Wieso passen denn Byte und Byte nicht??

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DanielHD80“ ()

    DanielHD80 schrieb:

    Welche Datentypen haben die Argumente, die du an die Write-Methode übergibst?
    Byte
    Falsch. (Und auf die Gefahr hin, dass ich kleinlich erscheine: es sind 3 Argumente.)

    ErfinderDesRades schrieb:

    Welche Datentypen werden verlangt?
    ?( finde ich nix zu... ?(
    Wat???

    DanielHD80 schrieb:

    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Write" mit diesen Argumenten aufgerufen werden kann:
    "Public Sub Write(buffer() As Byte, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.
    "Public Sub Write(buffer() As Char, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Char" konvertiert werden. C:\Dokumente und Einstellungen\blablabla\main.vb 359 17 Anwendungsname
    Wie gesagt (in post#5): Du brauchst nur hinzugucken.
    Probiers nochmal: Welche Datentypen werden verlangt? (2 Varianten sind zugelassen)

    Variante 1:

    Variante 2:

    Na?

    ErfinderDesRades schrieb:

    DanielHD80 schrieb:

    Welche Datentypen haben die Argumente, die du an die Write-Methode übergibst?
    Byte
    Auf die Gefahr hin, dass ich kleinlich erscheine: es sind 3 Argumente.

    ErfinderDesRades schrieb:

    Welche Datentypen werden verlangt?
    ?( finde ich nix zu... ?(
    Wat???

    DanielHD80 schrieb:

    Fehler 1 Fehler bei der Überladungsauflösung, da keine zugreifbare "Write" mit diesen Argumenten aufgerufen werden kann:
    "Public Sub Write(buffer() As Byte, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.
    "Public Sub Write(buffer() As Char, offset As Integer, count As Integer)": Der Wert vom Typ "Decimal" kann nicht in "1-dimensionales Array von Char" konvertiert werden. C:\Dokumente und Einstellungen\blablabla\main.vb 359 17 Anwendungsname
    Wie gesagt (in post#5): Du brauchst nur hinzugucken.
    Probiers nochmal: Welche Datentypen werden verlangt? (2 Varianten sind zugelassen)

    Variante 1: Byte, Integer, Integer

    Variante 2: Char, Integer, Integer

    Na?
    Aber ich habe doch "inzwischen" Byte...?

    Ich hab schon ganz andere Dinge hinbekommen... Aber jetzt dreh ich bald durch... Ich will doch einfach nur ein paar Werte über die Schnittstelle jagen :(

    DanielHD80 schrieb:



    EDIT: Nee... Doof... Ist ja in einer Schleife... Die Variable stimmt ja... Wird ja in jedem Durchlauf neu belegt...
    Aber irgendwie will das garnicht... :( Jetzt habe ich soweit alles, jetzt kommt aber die Fehlermeldung:

    VB.NET-Quellcode

    1. Der Wert vom Typ "Byte" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

    Hää? Wieso passen denn Byte und Byte nicht??


    Wie sieht denn jetzt dein Source aus?
    Variante 1: Byte, Integer, Integer
    Falsch, richtig, richtig
    Variante 2: Char, Integer, Integer
    Falsch, richtig, richtig

    VB.NET-Quellcode

    1. Der Wert vom Typ "Byte" kann nicht in "1-dimensionales Array von Byte" konvertiert werden.

    Hää? Wieso passen denn Byte und Byte nicht??

    Hier gilt es einen kleinen Unterschied zu beachten: Zwischen "Byte" und "1-dimensionales Array von Byte"

    VB.NET-Quellcode

    1. For i = 0 To 30
    2. Dim strHex As String = ausloesearray(i)
    3. Dim wertbyte As Byte
    4. wertbyte = CLng("&H" & strHex)
    5. s.Write(wertbyte, 0, 1)
    6. Next



    Unterschied bei Byte und Byte-Array? Wo ist der denn? Ich dachte das ist das gleiche, nur dass ich eben ein Byte-Array mit x Byte-Werten füllen kann?
    Der unterschied zwischen einem Byte array und dem normalen Byte ist der, das in einem Array quasi mehrere byte's gespeichert werden können

    VB.NET-Quellcode

    1. For i = 0 To 30
    2. Dim strHex As String = ausloesearray(i)
    3. Dim wertbyte(0) As Byte ' Ich glaub das geht mit 0 ;)
    4. wertbyte(0) = CLng("&H" & strHex)
    5. s.Write(wertbyte, 0, wertbyte.Lenght)
    6. Next

    Sollte so gehen ;)

    K_K schrieb:

    Der unterschied zwischen einem Byte array und dem normalen Byte ist der, das in einem Array quasi mehrere byte's gespeichert werden können

    VB.NET-Quellcode

    1. For i = 0 To 30
    2. Dim strHex As String = ausloesearray(i)
    3. Dim wertbyte(0) As Byte ' Ich glaub das geht mit 0 ;)
    4. wertbyte(0) = CLng("&H" & strHex)
    5. s.Write(wertbyte, 0, wertbyte.Lenght)
    6. Next

    Sollte so gehen ;)

    Jetzt wird's ganz komisch... Ich habe in die Zeile vor dem s.write ein MsgBox(wertbyte(i)) eingebaut und da werden die Werte richtige angezeigt. Ich bekomme also nacheinander immer eine Box mit den Inhalten 02, 30, 31, 30, ... angezeigt. Das passt! Das sind genau die (Hex-)Werte die übertragen werden sollen. Im Port-Sniffer kommt aber NICHTS an, erst im letzten Durchlauf kommt dieses Protokoll, obwohl die Übertragung ja in der Schleife jedes mal Byte für Byte gemacht wird...

    VB.NET-Quellcode

    1. Port geöffnet durch Vorgang "1.exe" (PID: 2936)
    2. Request: 10.06.2012 02:48:39.97064 (+43.0313 seconds)
    3. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    4. 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...............
    5. Port geschlossen