RS232 HEX oder Zahlen senden

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Zim.

    RS232 HEX oder Zahlen senden

    Hallo,
    Ich würde gerne über RS232 Zahlen oder HEX werte versenden. Leider kommen Falsche Werte an.
    Sowohl mit WriteLine als auch mit Write.

    RS232Port.Write(sendCHR)

    Und in sendCHR steht eine 2 drin
    Aber es Kommt DEZ 050 an ???
    Könnte vielleicht daran liegen, dass du das Zeichen "2" und nicht die Zahl 2 selbst übergeben hast.
    Es sieht so aus, als erwartet die Funktion einen Char. "2" als Char bedeutet 0x32 als Hexzahl und 50 als Dezimalzahl.

    Versuchs mal so:

    RS232Port.Write(Chr(2))

    lg SeriTools
    | Keine Fragen per PN oder Skype.
    Vielleicht nutzt Du die falsche CodePage:

    VB.NET-Quellcode

    1. System.Text.Encoding Encoding = System.Text.Encoding.Default
    2. Dim text As String = "bla"
    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 das mit den max 127 ist mit den Encoding weg.
    Nun nimmt das gerät welches ich damit ansprechen will das gesendete aber nicht immer an :(
    Kann es am Timing liegen ?
    "Gestartet wird eine Mitteilung mit einer Pause von min. 3,5 Charakter Times. Dies entspricht einer
    Zeit von ca. 4ms."
    Wird in der Beschreibung von dem Gerät genannt. Kann damit einer was anfangen ?
    Sendest Du Bytes (8 Bit) oder Char (16 Bit)?
    Das könnte ein Problem werden, weil Du das Timing des Sendens nicht explizit in der Hand hast.
    Also füge beim Senden nach jedem Zeichen eine Pause ein: Sleap(5) oder so.
    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!
    Kann es sein, dass bei Dir folgendes NICHT zutrifft:
    Option Explicit On
    Option Strict On
    ?

    VB.NET-Quellcode

    1. Dim yy As String = Chr(32)

    erzeugt ein Leerzeichen.
    Chr("kjhkjh") erzeugt einen Fehler!
    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!
    Du musst jede Variable explizit deklarieren,
    Du musst jede Typkonvertierung explizit durchführen.
    D.h., Du weißt, ob Du 8- oder 16-Bit-Zeichen sendest.
    Das System macht auch alles implizit, aber das ist kein Stil, das ist Scheiße.
    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!
    Ich sehe bei SerialPort folgende Write-Operationen:
    Write(Byte(), int, int) - Byte-Array, Startindex, Anzahl (8 Bit)
    Write(Char(), int, int) - Char-Array, Startindex, Anzahl (16 Bit)
    Write(String) - (16 Bit)

    Probiere mal folgendes, hatten wir oben schon mal:

    VB.NET-Quellcode

    1. Dim Encoding As System.Text.Encoding = System.Text.Encoding.Default
    2. Dim by As Byte() = Encoding.GetBytes(text)
    3. SerialPort1.Write(by, 0, by.Length)

    Das schreibt sauber 8 Bit und sollte eigentlich funktionieren.
    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!
    :D ich hab das die ganze zeit nicht verstanden ...

    Okey ähm machen wirs anders :D

    Hier der Code:

    VB.NET-Quellcode

    1. Sub test()
    2. Dim Msg(8) As Byte
    3. Dim sendCHR As Byte
    4. Msg(0) = 25
    5. Msg(1) = 16
    6. Msg(2) = 0
    7. Msg(3) = 19
    8. Msg(4) = 0
    9. Msg(5) = 1
    10. Msg(6) = 2
    11. Msg(7) = 0
    12. Msg(8) = 10
    13. Dim temp As String = Crc_(Msg, 8)
    14. Dim sendCRC1 As Byte = CByte(CInt("&H" & VB.Left(temp, 2)))
    15. Dim sendCRC2 As Byte = CByte(CInt("&H" & VB.Right(temp, 2)))
    16. For j = 0 To 8 'Befehl Senden an MFC
    17. sendCHR = Msg(j)
    18. RS232Port.Write(Chr(sendCHR))
    19. Next (j)
    20. RS232Port.Write(Chr(sendCRC1))
    21. RS232Port.Write(Chr(sendCRC2))
    22. End Sub


    Sooo .. Die Werte aus dem Array müssen gesendet werden und dann noch die CRC Werte die bekomme ich aus einer anderen Funktion.

    Im Momment muss ich das in der Regel 2 mal senden, teilweise aber auch öffter damit das Gerät es akzeptiert.

    Wie würde ich das nun machen müssen wenn ich das mit dem Write Byte befehl senden will ?

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

    Endlich mal ein Stück Code.

    VB.NET-Quellcode

    1. Sub test()
    2. Dim Msg(8) As Byte
    3. Msg(0) = 25
    4. Msg(1) = 16
    5. Msg(2) = 0
    6. Msg(3) = 19
    7. Msg(4) = 0
    8. Msg(5) = 1
    9. Msg(6) = 2
    10. Msg(7) = 0
    11. Msg(8) = 10
    12. RS232Port.Write(Msg, 0, Msg.Count)
    13. End Sub
    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!