RS232, diesmal ohne COM-Server

  • VB.NET
  • .NET (FX) 4.0

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

    RS232, diesmal ohne COM-Server

    Moin, moin,

    in einer bereits laufenden Anwendung steuere ich diverse Geräte über einen COM-Server (zur Vervielfachung der Ports...) an. Die Kommunikation ist denkbar einfach:

    VB.NET-Quellcode

    1. Dim dataSend() As Byte
    2. Dim myUdpClient As UdpClient
    3. myUdpClient = New UdpClient(nport_ip, nport_port) 'IP des Comservers, Port, über den der String gesendet werden soll
    4. dataSend = Encoding.ASCII.GetBytes("sw i01" & Environment.NewLine) 'eigentliches Kommando
    5. myUdpClient.Send(dataSend, dataSend.Length)
    6. myUdpClient.Close()


    ..habs leider nur mit Copypaste ans Laufen gebracht, aber es geht :D

    Nun aber wird es für ein anderes Programm (für mich) ziemlich verwirrend. Aus dieser Lage hat mir auch eine zweitägige Googelei nicht herausgeholfen, so dass Ihr meine vorerst letzte Hoffnung seid...

    Es soll nun nur ein Gerät am COM-Port5 betrieben werden und an dieses ein kurzer String (sw i01) gesandt werden. Einen COM-Server gibts in diesem Falle nicht, die Schnittstelle muss also direkt angesprochen werden. ;(

    Ich habe mich schon mit der SerialPort-Klasse herumgeschlagen, dort aber nur über Reading und nicht(s mir verständliches) übers Senden gefunden.

    Kennt jemand des Rätsels Lösung?


    Vielen Dank vom Vielfrager 8-)

    vielfrager schrieb:

    Senden
    nicht gefunden? Glaub ich nicht.

    VB.NET-Quellcode

    1. Me.SerialPort1.PortName = "COM5"
    2. ' Boudrate etc setzen
    3. Me.SerialPort1.Open()
    4. Me.SerialPort1.Write("xyz")
    5. Me.SerialPort1.Close()
    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 weiß, dass ich nichts weiß... Hilfst Du trotzdem?

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. 'hier muss sicher der Aufruf rein?
    4. End Sub
    5. End Class
    6. Public Class PortChat
    7. Shared _continue As Boolean
    8. Shared _serialPort As SerialPort
    9. Public Shared Sub Main()
    10. Dim name As String
    11. Dim message As String
    12. Dim sComparer As StringComparer = StringComparer.OrdinalIgnoreCase
    13. Dim readThread As Thread = New Thread(AddressOf Read)
    14. ' Create a new SerialPort object with default settings.
    15. _serialPort = New SerialPort()
    16. ' Allow the user to set the appropriate properties.
    17. _serialPort.PortName = SetPortName(_serialPort.PortName)
    18. _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate)
    19. _serialPort.Parity = SetPortParity(_serialPort.Parity)
    20. _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits)
    21. _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits)
    22. _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake)
    23. ' Set the read/write timeouts
    24. _serialPort.ReadTimeout = 500
    25. _serialPort.WriteTimeout = 500
    26. _serialPort.Open()
    27. _continue = True
    28. readThread.Start()
    29. Console.Write("Name: ")
    30. name = Console.ReadLine()
    31. Console.WriteLine("Type QUIT to exit")
    32. While (_continue)
    33. message = Console.ReadLine()
    34. If sComparer.Equals("quit", message) Then
    35. _continue = False
    36. Else
    37. _serialPort.WriteLine( _
    38. String.Format("<{0}>: {1}", name, message))
    39. End If
    40. End While
    41. readThread.Join()
    42. _serialPort.Close()
    43. End Sub
    44. Public Shared Sub Read()
    45. While (_continue)
    46. Try
    47. Dim message As String = _serialPort.ReadLine()
    48. Console.WriteLine(message)
    49. Catch ex As TimeoutException
    50. ' Do nothing
    51. End Try
    52. End While
    53. End Sub
    54. Public Shared Function SetPortName(ByVal defaultPortName As String) As String
    55. Dim newPortName As String
    56. Console.WriteLine("Available Ports:")
    57. Dim s As String
    58. For Each s In SerialPort.GetPortNames()
    59. Console.WriteLine(" {0}", s)
    60. Next s
    61. Console.Write("COM port({0}): ", defaultPortName)
    62. newPortName = Console.ReadLine()
    63. If newPortName = "" Then
    64. newPortName = defaultPortName
    65. End If
    66. Return newPortName
    67. End Function
    68. Public Shared Function SetPortBaudRate(ByVal defaultPortBaudRate As Integer) As Integer
    69. Dim newBaudRate As String
    70. Console.Write("Baud Rate({0}): ", defaultPortBaudRate)
    71. newBaudRate = Console.ReadLine()
    72. If newBaudRate = "" Then
    73. newBaudRate = defaultPortBaudRate.ToString()
    74. End If
    75. Return Integer.Parse(newBaudRate)
    76. End Function
    77. Public Shared Function SetPortParity(ByVal defaultPortParity As Parity) As Parity
    78. Dim newParity As String
    79. Console.WriteLine("Available Parity options:")
    80. Dim s As String
    81. For Each s In [Enum].GetNames(GetType(Parity))
    82. Console.WriteLine(" {0}", s)
    83. Next s
    84. Console.Write("Parity({0}):", defaultPortParity.ToString())
    85. newParity = Console.ReadLine()
    86. If newParity = "" Then
    87. newParity = defaultPortParity.ToString()
    88. End If
    89. Return CType([Enum].Parse(GetType(Parity), newParity), Parity)
    90. End Function
    91. Public Shared Function SetPortDataBits(ByVal defaultPortDataBits As Integer) As Integer
    92. Dim newDataBits As String
    93. Console.Write("Data Bits({0}): ", defaultPortDataBits)
    94. newDataBits = Console.ReadLine()
    95. If newDataBits = "" Then
    96. newDataBits = defaultPortDataBits.ToString()
    97. End If
    98. Return Integer.Parse(newDataBits)
    99. End Function
    100. Public Shared Function SetPortStopBits(ByVal defaultPortStopBits As StopBits) As StopBits
    101. Dim newStopBits As String
    102. Console.WriteLine("Available Stop Bits options:")
    103. Dim s As String
    104. For Each s In [Enum].GetNames(GetType(StopBits))
    105. Console.WriteLine(" {0}", s)
    106. Next s
    107. Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString())
    108. newStopBits = Console.ReadLine()
    109. If newStopBits = "" Then
    110. newStopBits = defaultPortStopBits.ToString()
    111. End If
    112. Return CType([Enum].Parse(GetType(StopBits), newStopBits), StopBits)
    113. End Function
    114. Public Shared Function SetPortHandshake(ByVal defaultPortHandshake As Handshake) As Handshake
    115. Dim newHandshake As String
    116. Console.WriteLine("Available Handshake options:")
    117. Dim s As String
    118. For Each s In [Enum].GetNames(GetType(Handshake))
    119. Console.WriteLine(" {0}", s)
    120. Next s
    121. Console.Write("Handshake({0}):", defaultPortHandshake.ToString())
    122. newHandshake = Console.ReadLine()
    123. If newHandshake = "" Then
    124. newHandshake = defaultPortHandshake.ToString()
    125. End If
    126. Return CType([Enum].Parse(GetType(Handshake), newHandshake), Handshake)
    127. End Function
    128. End Class

    vielfrager schrieb:

    Hilfst Du trotzdem?
    Was genau ist das Problem?
    Kommen Fehler?
    Wenn ja: Welche, in welcher Zeile?
    Was soll das, dass Du PortName & Co über die Console einliest?
    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!

    vielfrager schrieb:

    95% Codezeilen weniger
    Die Parameter des Ports werden von der Hardware, nicht aber vom User vorgegeben. Sie müssen nur mit der Gegenstelle übereinstimmen, also nimm bei beiden Teilnehmern Standardeinstellungen und feddich.
    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!

    sonne75 schrieb:

    Also muss der User es mitteilen
    Das wird vorher vereinbart:
    Ein Telefonat: Standardeinstellungen und feddich.
    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!

    sonne75 schrieb:

    welches der Kunde einstellt
    Der Kunde interessiert sich ausschließlich für die Port-Nummer, die anderen Einstellungen sind Standard oder genau die aus dem Handbuch.
    Die sind fix für alle Zeiten.
    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!

    sonne75 schrieb:

    unsere Kunden
    Ich programmiere Geräte für Leute, die ausschließlich mit Standardeinstellungen arbeiten, weil sie sonst in Teufels Küche kommen.
    Nur zur Entwicklungszeit wird da mal was angefasst, zur "Arbeitszeit" sind diese Einstellungen tabu.
    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!

    sonne75 schrieb:

    dass er es nicht braucht...

    vielfrager schrieb:

    Das Ganze geht sicher auch mit 95% Codezeilen weniger...
    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!
    Konkret geht es um einen HDMI-Switch von ATEN, der gesteuert werden soll.
    Lt. Handbuch sind die Anforderungen:
    Baudrate 19200
    Databits 8
    Stopbits 1
    Parity None
    FlowControl None

    Hilft das?

    @rod
    .write wird nicht "angeboten" wenn ich den oben gezeigten Code nutze??

    vielfrager schrieb:

    .write wird nicht "angeboten"
    Bilder
    • Serial.png

      16,87 kB, 617×267, 104 mal angesehen
    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!