AK Befehle über COM

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von tschulian.

    AK Befehle über COM

    Hallo Gemeinde,

    ich hatte eigentlich eine kleine Aufgabe vor die sich allerdings doch schwerer als erwartet gestaltet hat.

    Der Hintergrund:

    In der Automobilbranche gibt es den Standard der AK Befehle, damit werden seriell verbundene Messgeräte gesteuert. Es gibt bisher (mir kein bekanntes) Programm in dem man 'einfach' den Port wählt, verbindet und Befehle schicken kann. Dies wäre allerdings eine extreme Erleichterung für Servicetechniker öä.
    Prinzipiell ist es keine große Sache Daten per COM zu verschicken, habe ich auch schon hinbekommen. Nur der Syntax dieser Befehle macht mir zu schaffen. Ich habe ein Bild angefügt um diese zu verdeutlichen.



    Ich habe auch ein Beispielprogramm gefunden (nicht von mir, nur cut and paste) dessen Code ich unten angefügt habe. Wenn ich Pin 2und3 brücke kommen die Daten im Empfangsfenster an, somit gehe ich von einer funktionierenden Hardware aus. Unsere Messgeräte sind auch okay, sie reagieren ebenfalls auf AK Befehle.

    Zu meiner Person, bin ein "Wiedereinstiger" und komme von früheren VB Versionen. Natürlich wäre es besser an anderer Stelle einzusteigen, allerdings lerne ich am liebsten und besten problembezogen(für den gewissen Ehrgeiz). Ich erwarte nicht, dass mir jemand ein fertiges Programm liefert, Hilfestellungen und Denkanstöße wären super :)

    viele Grüße
    Julian

    Quellcode

    1. 'Code Starts here ....
    2. 'Import Systems which we are gonna use in our code
    3. Imports System
    4. Imports System.ComponentModel
    5. Imports System.Threading
    6. Imports System.IO.Ports
    7. 'frmMain is the name of our form ....
    8. 'Here starts our main form code .....
    9. Public Class frmMain
    10. Dim myPort As Array
    11. Delegate Sub SetTextCallback(ByVal [text] As String)
    12. 'Page Load Code Starts Here....
    13. Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. myPort = IO.Ports.SerialPort.GetPortNames()
    15. cmbBaud.Items.Add(9600)
    16. cmbBaud.Items.Add(19200)
    17. cmbBaud.Items.Add(38400)
    18. cmbBaud.Items.Add(57600)
    19. cmbBaud.Items.Add(115200)
    20. For i = 0 To UBound(myPort)
    21. cmbPort.Items.Add(myPort(i))
    22. Next
    23. cmbPort.Text = cmbPort.Items.Item(0)
    24. cmbBaud.Text = cmbBaud.Items.Item(0)
    25. btnDisconnect.Enabled = False
    26. End Sub
    27. 'Page Load Code Ends Here ....
    28. 'Connect Button Code Starts Here ....
    29. Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    30. SerialPort1.PortName = cmbPort.Text
    31. SerialPort1.BaudRate = cmbBaud.Text
    32. SerialPort1.Parity = IO.Ports.Parity.None
    33. SerialPort1.StopBits = IO.Ports.StopBits.One
    34. SerialPort1.DataBits = 8
    35. SerialPort1.Open()
    36. btnConnect.Enabled = False
    37. btnDisconnect.Enabled = True
    38. End Sub
    39. 'Connect Button Code Ends Here ....
    40. 'Disconnect Button Code Starts Here ....
    41. Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
    42. SerialPort1.Close()
    43. btnConnect.Enabled = True
    44. btnDisconnect.Enabled = False
    45. End Sub
    46. 'Disconnect Button Code Ends Here ....
    47. 'Send Button Code Starts Here ....
    48. Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click
    49. SerialPort1.Write(txtTransmit.Text)
    50. End Sub
    51. 'Send Button Code Ends Here ....
    52. 'Serial Port Receiving Code Starts Here ....
    53. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    54. ReceivedText(SerialPort1.ReadExisting())
    55. End Sub
    56. 'Serial Port Receiving Code Ends Here ....
    57. 'Serial Port Receiving Code(Invoke) Starts Here ....
    58. Private Sub ReceivedText(ByVal [text] As String)
    59. If Me.rtbReceived.InvokeRequired Then
    60. Dim x As New SetTextCallback(AddressOf ReceivedText)
    61. Me.Invoke(x, New Object() {(text)})
    62. Else
    63. Me.rtbReceived.Text &= [text]
    64. End If
    65. End Sub
    66. 'Serial Port Receiving Code(Invoke) Ends Here ....
    67. 'Com Port Change Warning Code Starts Here ....
    68. Private Sub cmbPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbPort.SelectedIndexChanged
    69. If SerialPort1.IsOpen = False Then
    70. SerialPort1.PortName = cmbPort.Text
    71. Else
    72. MsgBox("Valid only if port is Closed", vbCritical)
    73. End If
    74. End Sub
    75. 'Com Port Change Warning Code Ends Here ....
    76. 'Baud Rate Change Warning Code Starts Here ....
    77. Private Sub cmbBaud_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaud.SelectedIndexChanged
    78. If SerialPort1.IsOpen = False Then
    79. SerialPort1.BaudRate = cmbBaud.Text
    80. Else
    81. MsgBox("Valid only if port is Closed", vbCritical)
    82. End If
    83. End Sub
    84. 'Baud Rate Change Warning Code Ends Here ....
    85. End Class
    86. 'Whole Code Ends Here ....
    Willkommen im Forum. :thumbup:
    Zunächst muss folgendes geklärt werden.
    Erwartet die Gegenstelle (Unicode-)Strings oder eine Reihe von Bytes?
    Je nach dem musst Du Deinen Code planen.
    <STX> und <ETX> sind je 1 Byte Steuerzeichen, der Rest sieht nach Klartext aus. Das sollte also nicht sonderlich problematisch sein.
    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!