Fehler beim Senden von Hex werten über den Serial Port ..

  • VB.NET

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

    Fehler beim Senden von Hex werten über den Serial Port ..

    Hallo zusammen, ich hoffe mir kann einer auf die Sprünge helfen ......

    ich habe folgendes Problem,

    ich versuche über den Serial Port eine hex Kette zu versenden, (01 06 00 02 01 F4 28 1D), das klappt auch soweit, mein Problem ist das die Gegenseite die Werte nicht erkennt!?
    Sende ich dieselben Werte über ein Externes Programm (Comm Operator), werde diese erkannt und auch Bestätigt!

    Auch wenn ich mir den Mitschnitt ansehe, erkenne ich keine Fehler, was das Telegramm betrifft.






    Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Try
    3. SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28591) 'Bitweise Senden
    4. SerialPort1.Open()
    5. SerialPort1.Write(New Byte() {&H1}, 0, 1)
    6. SerialPort1.Write(New Byte() {&H6}, 0, 1)
    7. SerialPort1.Write(New Byte() {&H0}, 0, 1)
    8. SerialPort1.Write(New Byte() {&H2}, 0, 1)
    9. SerialPort1.Write(New Byte() {&H1}, 0, 1)
    10. SerialPort1.Write(New Byte() {&HF4}, 0, 1)
    11. SerialPort1.Write(New Byte() {&H28}, 0, 1)
    12. SerialPort1.Write(New Byte() {&H1D}, 0, 1)
    13. Catch ex As Exception
    14. MsgBox("keine Verbindung")
    15. End Try
    16. If SerialPort1.IsOpen = True Then
    17. SerialPort1.Close()
    18. End If
    19. End Sub


    Danke im Voraus .....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „M.P.“ ()

    msdn.microsoft.com/en-US/libra…atabits%28v=VS.80%29.aspx

    Die Parity musst du dann wahrscheinlich auf None setzen.

    Wichtig ist, dass die Leitungsparameter auf beiden Seiten gleich sind, sonst verstehen sich die Partner nicht.
    Baudrate, Bits, Parity, DSR/DTR, RTS/CTS...

    Vergleiche die Einstellungen auf beiden Seiten und passe sie entsprechend an.
    msdn.microsoft.com/en-US/libra…perties%28v=VS.80%29.aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    ok da komme ich jetzt nicht ganz mit, denn mit Komikation habe ich ja keine Propleme, sondern nur das zwei telegramm gleichzeitg versendet werden, ich aber mochte das die telegramme hineinander versendet werden

    telegramm 1
    telegramm 2

    entweder durch einen zeilenbruch oder andere möglichkeiten wenn es welche gibt..
    Wie wäre es mit

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Try
    3. Dim daten() As Byte = {&H1, &H6, &H0, &H2, &H1, &HF4, &H28, &H1D}
    4. 'SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28591) 'Bitweise Senden
    5. SerialPort1.Open()
    6. SerialPort1.Write(daten, 0, daten.Length)
    7. SerialPort1.Close()
    8. Catch ex As Exception
    9. MsgBox("keine Verbindung")
    10. End Try
    11. End Sub

    Wenn Du Bytes sendest, brauchst Du kein Encoding.
    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!
    jep, soweit habe ich den Code schon geändert, ich poste mal das ganze ....

    Quellcode

    1. Public Class Status
    2. Private Sub Status_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. Try
    4. ' PORT wird Geöffnet (COM3 / BAUD 19600)
    5. SerialPort1.Open()
    6. Catch ex As Exception
    7. MsgBox("Keine Schnittsteller Vorhanden oder Frei ....")
    8. End Try
    9. End Sub
    10. '####################################
    11. '######## AUF und Ab Fahrt ########
    12. '####################################
    13. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTauf.Click
    14. Try
    15. ' Sequenz zum AUF Fahren des Motors (01 06 00 04 00 03 88 0A)in HEX
    16. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &H3, &H88, &HA}
    17. SerialPort1.Write(block, 0, block.Length)
    18. Catch ex As Exception
    19. MsgBox("keine Verbindung")
    20. End Try
    21. End Sub
    22. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTstop.Click
    23. Try
    24. ' Sequenz zum Stoppen der Fahrt des Motors (01 06 00 04 00 02 49 CA)in HEX
    25. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &H2, &H49, &HCA}
    26. SerialPort1.Write(block, 0, block.Length)
    27. Catch ex As Exception
    28. MsgBox("keine Verbindung")
    29. End Try
    30. End Sub
    31. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTab.Click
    32. Try
    33. ' Sequenz zum AB Fahren des Motors (01 06 00 04 00 04 C9 C8)in HEX
    34. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &H4, &HC9, &HC8}
    35. SerialPort1.Write(block, 0, block.Length)
    36. Catch ex As Exception
    37. MsgBox("keine Verbindung")
    38. End Try
    39. End Sub
    40. '################################################
    41. '############## Referenz ################
    42. '################################################
    43. Private Sub ReferenzfahrtToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ReferenzfahrtToolStripMenuItem.Click
    44. Try
    45. ' Sequenz für Referenzfart des Motors (01 06 00 04 00 01 09 CB)in HEX
    46. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &H1, &H9, &HCB}
    47. SerialPort1.Write(block, 0, block.Length)
    48. Catch ex As Exception
    49. MsgBox("keine Verbindung")
    50. End Try
    51. End Sub
    52. '################################################
    53. '############ Lamellenwinkel ################
    54. '################################################
    55. Sub LamelleStart()
    56. Try
    57. ' Sequenz für den Startbefehl (01 06 00 04 00 0B 89 CC)in HEX
    58. Dim start() As Byte = New Byte() {&H1, &H6, &H0, &H4, &H0, &HB, &H89, &HCC}
    59. SerialPort1.Write(start, 0, start.Length)
    60. Catch ex As Exception
    61. MsgBox("keine Verbindung")
    62. End Try
    63. End Sub
    64. Private Sub Button6_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button6.Click
    65. Try
    66. ' Sequenz für Lamellenwinkel 0% (01 06 00 03 00 00 79 CA)in HEX
    67. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H3, &H0, &H0, &H79, &HCA}
    68. SerialPort1.Write(block, 0, block.Length)
    69. 'LamelleStart()
    70. Catch ex As Exception
    71. MsgBox("keine Verbindung")
    72. End Try
    73. End Sub
    74. Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
    75. Try
    76. ' Sequenz für Lamellenwinkel 50% (01 06 00 03 01 F4 79 DD)in HEX
    77. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H3, &H1, &HF4, &H79, &HDD}
    78. SerialPort1.Write(block, 0, block.Length)
    79. Catch ex As Exception
    80. MsgBox("keine Verbindung")
    81. End Try
    82. End Sub
    83. Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    84. Try
    85. ' Sequenz für Lamellenwinkel 100% (01 06 00 03 03 E8 79 74)in HEX
    86. Dim block() As Byte = New Byte() {&H1, &H6, &H0, &H3, &H3, &HE8, &H79, &H74}
    87. SerialPort1.Write(block, 0, block.Length)
    88. Catch ex As Exception
    89. MsgBox("keine Verbindung")
    90. End Try
    91. End Sub
    92. Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    93. '' Sequenz für den Startbefehl (01 06 00 04 00 0B 89 CC)in HEX
    94. LamelleStart()
    95. End Sub
    96. Private Sub EXITToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EXITToolStripMenuItem.Click
    97. Close()
    98. End Sub
    99. Private Sub Status_FormClosed(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
    100. ' Es wird Geprüft ob der Port geöffnet ist, wenn ja wird er Geschlossen
    101. If SerialPort1.IsOpen = True Then
    102. SerialPort1.Close()
    103. End If
    104. End Sub
    105. End Class


    wie gesagt das proplem besteht darin zwei telegramme mit einen Bottun zu versenden ...

    also
    telegramm 1
    telegramm 2

    und nicht
    telegramm 1 telegramm2

    habt ihr da eine lösung für mich, wäre super ...

    danke schoneinmal im voraus ...
    Verwende bitte den [vb]-Tag, nicht den [code]-Tag.
    Kannst Du bitte das Problem genauer beschreiben?
    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!
    hallo, ok werd ich das nächste mal machen ...

    also ich möchte gerne das ich mit einen Button zwei Telegramme versenden kann, und zwar so das sie jeweils in einer eigen zeile Steht ...

    telegramm 1 .. besagt was zu tun ist (01 06 00 04 00 03 88 0A )
    telegramm 2 .. besagt mach es nun (04 06 00 04 00 03 88 5F)

    mein problem ist das ich zwar die Telegramme versenden kann, aber das sie dann hineinander stehen und somit kann mein Kontroller damit nichts anfangen kann,
    da er meint das es ein Telegramm ist.

    Lege ich jedes Telegramm für sich auf ein Button klappt alles, ich möchte es gerne aber, so das es über einen Funktioniert ...

    Danke im Voraus ...
    Du musst rauskriegen, welchen Separator der Controller erwartet.
    Ist es einfach ein vbLf oder vbCr oder vbCrLf, das du hinten anfügen musst?
    Musst du das Telegramm einpacken in STX/ETX?
    Oder ist es ein noch komplizierteres Protokoll?

    Lies das Handbuch deines Controllers.

    Die Tatsache, dass es mit dem Konsolprogramm geht, lässt eventuell auf das Anfügen von CR=vbCr=Chr(13)=&H0D schließen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „petaod“ ()

    also die hex werte die ich dir mit gesendet habe sind orginale, heist ich habe sie mit geschnitten ....

    auch wenn beim siniefer zwischen DEC/HEX/Text umschalte, erhalte ich keine Andere Hex werte und
    wie gesagt wenn ich die Telegramme auf zwei Buttons verteile geht es ja, es geht nur darum zwei Telegramm über einen
    Button einzeln zu versenden, spich das dann ein Zeilenbruch erfolgt.

    das mit Anhängen vom Zeilenbruch habe ich auch schon Versucht, Klapt aber nicht ?!

    SerialPort1.Write(P1auf1, 0, P1auf1.Length & vbCrLf)

    oder wie müsste die Richtige Syntax Ausehen, wenn ich oben Verwenden möchte ?????

    es ist ein einfachen Modbus Protokoll !
    Möglicherweise reagiert der Controller auf einen Timeout.
    Versuch mal einen kurzen Sleep zwischen den Telegrammen.

    es ist ein einfachen Modbus Protokoll
    Im RTU-Modus ist der Trenner eine Wartezeit von 3,5 Zeichen.
    de.wikipedia.org/wiki/Modbus
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich glaube eher, dass da im Protokoll noch was fehlt. Die beiden Zeilen müssten wenigstens die gleichen Ende-Zeichen oder Ende-Sequenzen haben.
    Was passiert denn, wenn Du das Protokoll im Einzelschrittmodus ablaufen lässt?
    Haltepunkt (F9) auf die 1. Zeile und dann mit F10 weitergehen.
    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, ersteinmal danke, das war ein super tip und es geht super ..
    wenn du willst kannst dir mal das ganze projet ansehen........

    Ziel ist es 4Motoren entweder einzeln oder gemeinsamm zu bedienen, auf,stop,ab - 0%,50%,100% funktioniert schon, dank deiner hilfe ...

    der rest kommt auch noch was den status und so weiter betrifft ...

    was mich jetzt noch stört sind de Abfrage für die checkboxen, das könnte man bestimmt eleganter lösen ...

    leider kann ich dir den code nicht senden, angeblich zu groß oder zu fiele zeilen ....

    PS. hab doch einen weg gefunden ....
    Dateien
    sorry habs erst jetzt gelesen, soeol auch auch, in dieser phase sind es fixe telegramme, später sollen es dann über die berechnung gehen,
    wobvei ich mir noch nicht ganz klar bin wie ich das bewerstelligen soll!!!

    hast du dir das projekt mal angesehen???
    und wenn ja was würdest du anders machen !???