Stringwerte als Hex Senden ..

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von M.P..

    Stringwerte als Hex Senden ..

    Hallo alle zusammen,
    ich habe folgendes Problem ...

    ich mochte den String 01060003 über den Serial Port versenden und zwar eins zu eins,
    sprich aus 01 soll nicht 30 werden, sondern es soll 01 bleiben ...

    nehmen wir an ich habe in einer TextBox oder Variable den Wert 01060003 stehen,
    wie kann ich den Versenden ohne das er Umgewandelt wird ...

    Wenn das überhaupt Möglich ist ... ?(

    ich bedanke mich schon einmal im Voraus ...
    hallo,
    ja zum versenden ich den SerialPort ..
    wie schaffe ich es das er "F9" sendet, da es der richtige wert währe ...

    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim XX As String = "F9"
    3. SerialPort1.Write(XX)
    4. End Sub


    .. so hir kann ich den Wert "f9" über den Serialport ausgeben, aber bei dieser metohde kann ich die Variable "xx" nicht ändern ...

    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim XX As Byte() = New Byte() {&HF9}
    3. SerialPort1.Write(XX, 0, XX.Length)
    4. End Sub


    ..... ?(
    Geht leider nicht ....

    oder ich mache was fallsch ...

    VB.NET-Quellcode

    1. Function StringToByteArray(ByRef str As String) As Byte()
    2. 'Try
    3. Return System.Text.Encoding.ASCII.GetBytes(str.ToString("X2"))
    4. 'Catch ex As Exception
    5. MsgBox(" Fehler")
    6. 'End Try
    7. End Function
    8. Private Sub btnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    9. 'StringToByteArray(txtSenden.Text)
    10. MsgBox(StringToByteArray(txtSenden.Text))
    11. End Sub
    ok, jetzt stehe ich etwas auf der Leitung, wo aoll ich das einfügen ...

    soll ich
    Return System.Text.Encoding.ASCII.GetBytes(str.ToString("X2"))

    durch
    Return Integer.ToString(Integer.Parse(str, HexNumber), 2).GetBytes()
    ersetzen, wenn ja bekomme ich eine Fehler Meldung ...

    der Name "HexNumber" nicht Deklariert ...

    sorry
    Hallo, also egal wie ich die werte übergebe, der serialport wandel sie immer um,
    auser ich deklariere sie mit "new byte() {&H..}" , da kann ich aber keine werte im
    laufenden Programm ändern, z.B über eine schleife oder durch Eingabe ....

    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal snder As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim xx As Byte() = New Byte() {&H9}
    3. 'Die Variable xx sollte aber änderbar sein!!
    4. 'z.B.
    5. 'Dim a, b As String
    6. 'Dim i As Integer
    7. 'a = Textbox1.text 'z.B. Wert 1
    8. 'b = TextBox2.text 'z.B. Wert 3
    9. 'For i = a To b
    10. ' xx(i)
    11. 'Next i
    12. SerialPort1.Write(xx, 0, xx.Length)
    13. End Sub
    ok,
    also der Sinn soll sein ein Telegramm zu generieren das drei Variablen hat und sech Feste Werte hat.

    Aussehen muss es folgender maßen " 01 06 00 03 00 04 CRC " 01 ist die Start Adresse, 00 04 ist der Wert der abgearbeitet werden soll, z.B. Motor fahr 500 Schritte und CRC ist die Checksumme .

    wenn ich feste werte vergebe ist das kein Problem, das sieht dann folgender maßen aus ...

    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal snder As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim xx() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &H3, &H88, &HA}
    3. SerialPort1.Write(xx, 0, xx.Length)
    4. End Sub

    so ich möchte aber das der Hexwert von &H1, &H0 und &H3 über die Software Veränderbar sind, Motor Adresse = &H1, soll über eine Schleife Jeweils um faktor x erhöt werden x - max = 64, &H0 und &H3 werden dann über ein Textfeld Verändert, da ich ja bestimmte werte eingeben muss von 0 ... 1000
    wenn ich die ausgabe umleite z.B. Textbox oder Msgbox, bekomme ich die richtigen werte angezeigt, nur wenn ich es dann über den Serialport versenden will, bekomme ich auf der

    gegenseite falsche werte ...
    so wie kann ich die anzeige von der Textbox so versenden wie ich sie angezeigt bekomme, denn da stimmt alles, ohne das mir der serialport die Werte umwandelt, ich sehe auf der Textbox den string F9 und möchte das auch F9 gesendet wird..
    ich weis, etwas kopliziert geschrieben, aber ich kann es nicht besser beschreiben ...
    Dein "Empfänger" erwartet GARANTIERT keine Hex-Strings. Der erwartet BYTES. In der Anleitung werden diese in hex-Form geschrieben (ist üblich) und nicht in Dezimalform oder irgendwas anderem. Das schon mal zur Klarstellung.
    Wenn du also
    0x01 0xff 0x20 senden sollst, sendest du einfach 1,255,32

    Und zum verändern der Werte schreibst du halt einfach das in dein Array, was du senden willst.


    private telegramm(8) as byte

    friend sub SetSchritte(byval s as byte)
    telegramm(5)=s
    end sub

    friend sub senden()
    SerialPort1.Write(telegramm, 0, 9)
    end sub

    usw usw usw

    Normalerweise würde man jetzt natürlich das Telegramm noch in ne lässige Klasse kapseln. Aber ich befürchte, das übersteigt deine aktuellen Kenntnisse dann doch etwas.

    M.P. schrieb:

    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim XX As Byte() = New Byte() {&HF9}
    3. SerialPort1.Write(XX, 0, XX.Length)
    4. End Sub

    Du hast doch die Lösung bereits gepostet, aber offensichtlich nicht verstanden.
    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!
    ok, ich kann dir nur sagen was ich beim abhöhren von der leitung sehe .. aber da magst du schon recht haben ...
    und wie verwende ich jetzt den code, also wo übergebe ich den wert von der TextBox dem telegramm, oder habe ich
    da einen denkfehler ....
    Zeig mal den Befehl, den Du senden willst und Deine Senderoutine.
    Und wenn es nicht zuviel verlangt ist, die Beschreibung der Syntax dieses Befehls.
    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 kannst auch einfach den String in die Bytewerte konvertieren und senden:

    VB.NET-Quellcode

    1. Private Sub btn_send_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim bytes As New List(Of Byte)
    3. For i As Integer = 0 To TextBox1.Text.Length Step 2
    4. bytes.Add(CByte("&H" & TextBox1.Text(i) & TextBox1.Text(i + 1)))
    5. Next
    6. SerialPort1.Write(bytes.ToArray(), 0, bytes.Count)
    7. End Sub

    Bei einem langen String dauert das umwandeln mit dieser wunderschönen Schleife zwar ein bisschen aber es geht. Ich weis zwar nicht wie deine hardware aussieht z.b. ob es da noch ein spezielles Protokoll gibt. wenn nicht kannst du den code übernehmen.

    Gruß, timmi31061
    Mit freundlichen Grüßen,
    Thunderbolt

    timmi31061 schrieb:

    Du kannst auch einfach den String in die Bytewerte konvertieren und senden:

    Genau dies ist nicht das, was über den Draht soll.
    Wäre das ein C/C++/C#-Gegenstelle, würde sie nur folgendes verstehen:

    VB.NET-Quellcode

    1. bytes.Add(CByte("0x" & TextBox1.Text(i) & TextBox1.Text(i + 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!
    @RodFromGermany: Mein Code interpretiert den string als hexvalue sprich f6453a wird interpretiert als 0xf6,0x45,0x3a. diese values werden dann als normale bytes gesendet.

    RodFromGermany schrieb:


    M.P. schrieb:


    VB.NET-Quellcode

    1. Private Sub btnSenden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSenden.Click
    2. Dim XX As Byte() = New Byte() {&HF9}
    3. SerialPort1.Write(XX, 0, XX.Length)
    4. End Sub


    Du hast doch die Lösung bereits gepostet, aber offensichtlich nicht verstanden.
    Mit freundlichen Grüßen,
    Thunderbolt
    hallo alle beide vorschläge klappen nicht ...
    aber trozdem danke für die Hilfe, ich Poste mal den Code ... kann ja sein das ich einbfach zu dumm bin ...

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Public InputDec As String
    3. Public Inputhex As String
    4. Public modbusCRC16Seed As Integer = &HFFFF ' Standard Seed for Modbus CRC-16
    5. Public modbusCRC16Poly As Integer = &HA001 ' Standard Poly for Modbus CRC-16
    6. Public modbusCRC16Data As Integer = 0 ' Intermediate CRC Value
    7. 'Dient zum Berechen der CRC SUMME
    8. Public Function AppendModbusCRC16(ByVal argHexStr As String) As String
    9. Dim tmpHexStr As String = argHexStr.Replace(" ", "")
    10. Dim hexByteCount As Integer = CInt(Strings.Len(tmpHexStr) / 2)
    11. Dim strHexCRC As String
    12. Dim bytex As Integer
    13. Dim bitx As Integer
    14. Dim outHexStr As String = ""
    15. Dim bit16is1 As Boolean = False
    16. modbusCRC16Data = modbusCRC16Seed ' Start CRC with 16 trues
    17. For bytex = 1 To hexByteCount
    18. Dim strHexByte As String = Strings.Mid(argHexStr, bytex * 2 - 1, 2) ' "01"
    19. Dim tmpByte As Byte = Convert.ToByte(strHexByte, 16) ' = 0000 0001
    20. Dim intByte As Integer = CInt(tmpByte) ' = 0000 0000 0000 0001
    21. modbusCRC16Data = intByte Xor modbusCRC16Data ' Xor with CRC
    22. For bitx = 1 To 8
    23. bit16is1 = CType(modbusCRC16Data And 1, Boolean) ' Is bit-16 true?
    24. modbusCRC16Data = modbusCRC16Data >> 1 ' Shift right by 1
    25. If bit16is1 Then modbusCRC16Data = modbusCRC16Data Xor modbusCRC16Poly
    26. Next
    27. outHexStr = outHexStr & strHexByte
    28. Next
    29. strHexCRC = Strings.Right("0" & modbusCRC16Data.ToString("x"), 4)
    30. strHexCRC = Strings.Right(strHexCRC, 2) & Strings.Left(strHexCRC, 2)
    31. AppendModbusCRC16 = outHexStr & UCase(strHexCRC)
    32. End Function
    33. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    34. Me.Close()
    35. End Sub
    36. Public Function Hex2(ByVal n As Byte) As String
    37. If n And &HF0 Then
    38. 'Hex$(n) ist bereits 2-stellig:
    39. Hex2 = Hex$(n)
    40. Else
    41. 'Hex$(n) ist 1-stellig, also 0 davorsetzen:
    42. Hex2 = "0" & Hex$(n)
    43. End If
    44. End Function
    45. Public Function Hex4(ByVal n As Long) As String
    46. If n And &HF000 Then
    47. 'Hex$(n) ist bereits 4-stellig:
    48. Hex4 = Hex$(n)
    49. ElseIf n And &HF00 Then
    50. 'Hex$(n) ist 1-stellig, also 0 davorsetzen:
    51. Hex4 = "0" & Hex$(n)
    52. Else
    53. 'Hex$(n) ist 1-stellig, also 0 davorsetzen:
    54. Hex4 = "00" & Hex$(n)
    55. End If
    56. End Function
    57. Private Sub btnHex_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnHex.Click
    58. Hex2(txtInput1.Text)
    59. txtUm1.Text = Hex2(txtInput1.Text)
    60. Hex2(txtInput2.Text)
    61. txtUm2.Text = Hex2(txtInput2.Text)
    62. Hex2(txtInput3.Text)
    63. txtUm3.Text = Hex2(txtInput3.Text)
    64. Hex2(txtInput4.Text)
    65. txtUm4.Text = Hex2(txtInput4.Text)
    66. Hex4(txtInput5.Text)
    67. txtUm5.Text = Hex4(txtInput5.Text)
    68. Inputhex = txtUm1.Text & txtUm2.Text & txtUm3.Text & txtUm4.Text & txtUm5.Text
    69. txtOutput.Text = AppendModbusCRC16(Inputhex)
    70. End Sub
    71. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    72. txtUm1.Enabled = False
    73. txtUm2.Enabled = False
    74. txtUm3.Enabled = False
    75. txtUm4.Enabled = False
    76. txtUm5.Enabled = False
    77. End Sub
    78. Private Sub btn_senden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_senden.Click
    79. Dim bytes As New List(Of Byte)
    80. Try
    81. For i As Integer = 0 To txtOutput.Text.Length Step 2
    82. bytes.Add(CByte("&H" & txtOutput.Text(i) & txtOutput.Text(i + 1)))
    83. Next
    84. SerialPort1.Open()
    85. SerialPort1.Write(bytes.ToArray(), 0, bytes.Count)
    86. SerialPort1.Close()
    87. Catch ex As Exception
    88. MsgBox("Fehler ....")
    89. End Try
    90. End Sub
    91. End Class


    Das mit den senden ist ja die sache, denn er sendet es nicht so wie ich es angezeigt bekomme ....

    Standart mit SerialPort1.wirte(AppendModbusCRC16(Inputhex)
    Dateien
    • CRC II.rar

      (308,83 kB, 123 mal heruntergeladen, zuletzt: )

    timmi31061 schrieb:

    Mein Code interpretiert den string als hexvalue sprich f6453a wird interpretiert als 0xf6,0x45,0x3a.
    Was erwartet denn die Gegenstelle von Dir?
    Bitte poste jetzt keinen solchen Spruch, sondern ein ordentliches Zitat aus der Beschreibung.
    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!