Good-Practice SerialPort? KlassenProperty? DataReading Sync?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Good-Practice SerialPort? KlassenProperty? DataReading Sync?

    Guten Abend!

    Bin dabei eine Library für Messgeräte zu schreiben. Alle Geräte haben SerialPorts zur Kommunikation, die auch später verwendet werden. Deswegen frage ich mal in die Runde was wärendie Good-practices hier?
    Für jedes Gerät habe ich eine Klasse, alle Geräte erben von Klasse "Instruments".

    Ich hatte vor eine Property SerialPort as SerialPort bei Instruments zu implementieren, bis dahin alles gut.
    Jetzt kommt aber die Sache mit Antwort lesen und da würde ich gerne Tipps haben:

    - Einfache Variante-> Delay (kann funktionieren muss aber nicht wenn man nicht genug lange wartet)

    - EreignisVariante ->SerialPort.Datareceived (wie kann ich die Property "WithEvents" machen, habs probiert mit privatem Field aber klappts nicht)

    - Eigenes Event?

    Mein Code der Instrument-Klasse sieht so aus:

    Quellcode

    1. Public Class Instrument
    2. Implements IInstrument
    3. Private _name As String
    4. Private WithEvents _serialPort As SerialPort
    5. Private _comPort As String
    6. Private _category As String
    7. Private _serienNummer As Integer
    8. Public Property Name As String Implements IInstrument.Name
    9. Get
    10. Return _name
    11. End Get
    12. Set
    13. _name = Value
    14. End Set
    15. End Property
    16. Public Property SerialPort As SerialPort Implements IInstrument.SerialPort
    17. Get
    18. Return _serialPort
    19. End Get
    20. Set
    21. _serialPort = Value
    22. End Set
    23. End Property
    24. Public Property ComPort As String Implements IInstrument.ComPort
    25. Get
    26. Return _comPort
    27. End Get
    28. Set
    29. _comPort = Value
    30. End Set
    31. End Property
    32. Public Property Category As String Implements IInstrument.Category
    33. Get
    34. Return _category
    35. End Get
    36. Set
    37. _category = Value
    38. End Set
    39. End Property
    40. Public Property SerienNummer As Integer Implements IInstrument.SerienNummer
    41. Get
    42. Return _serienNummer
    43. End Get
    44. Set
    45. _serienNummer = Value
    46. End Set
    47. End Property
    48. Public Sub TestTest(sender As Object, e As EventArgs) Handles SerialPort.DataReceived
    49. End Sub
    50. End Class


    Und so sieht einer der davon abgeleiteten Klasse (Model für ein DruckKalibrator PPC von Fluke).
    Ist in Bearbeitung also bitte nicht meckern falls unvollständige Sachen bzw. Fehlern vorhanden. Bitte Fokus auf SerialPort :D

    Quellcode

    1. Imports System.IO.Ports
    2. Imports HengesbachMessinstrumente
    3. Public Class PressureCalibratorPPC
    4. Inherits Instrument
    5. Private _targetPressure As Double = 0.0
    6. Private _controlStatus As String
    7. Private _pressureUnit As PressureUnit
    8. Private _comPortConfig As String
    9. Public Property TargetPressure As Double
    10. Get
    11. Return _targetPressure
    12. End Get
    13. Set
    14. Try
    15. SetTargetPressure(Value)
    16. _targetPressure = Value
    17. Catch e As Exception
    18. Throw New Exception(e.Message)
    19. End Try
    20. End Set
    21. End Property
    22. Public Property ControlStatus As String
    23. Get
    24. Return _controlStatus
    25. End Get
    26. Set(value As String)
    27. _controlStatus = value
    28. End Set
    29. End Property
    30. Friend Property PressureUnit As PressureUnit
    31. Get
    32. Return _pressureUnit
    33. End Get
    34. Set(value As PressureUnit)
    35. _pressureUnit = value
    36. End Set
    37. End Property
    38. Public Function GetComPortConfig() As String
    39. Dim strData = "COM1" & vbCr
    40. SerialPort.Write(strData)
    41. Return SerialPort.ReadTo(vbCrLf)
    42. End Function
    43. Public Sub SetComPortConfig(baud As Integer, parity As String, dataBits As Integer, stopBits As Integer)
    44. Dim strData = $"COM1={baud}, {parity}, {dataBits}, {stopBits}"
    45. SerialPort.Write(strData)
    46. End Sub
    47. Public Sub Abort()
    48. Dim strData = "ABORT" & vbCr
    49. SerialPort.Write(strData)
    50. End Sub
    51. Public Function GetCurrentAtmPressure() As String
    52. Dim strData = "ATM"
    53. SerialPort.Write(strData)
    54. Return SerialPort.ReadTo(vbCrLf)
    55. End Function
    56. Public Sub ReturnControlToLocal()
    57. SerialPort.Write("LOCAL")
    58. End Sub
    59. Public Sub Reset()
    60. End Sub
    61. Private Sub SetTargetPressure(pressure As Single)
    62. Dim strData = "PS " & Convert.ToString(pressure, System.Globalization.CultureInfo.InvariantCulture) & vbCr
    63. SerialPort.Write(pressure)
    64. End Sub
    65. Public Function PressureReady() As Boolean
    66. Dim strData = "SR?" & vbCr
    67. SerialPort.Write(strData)
    68. If SerialPort.ReadTo(vbCrLf) = "R" Then
    69. Return True
    70. Else
    71. Return False
    72. End If
    73. End Function
    74. Public Function GetSerialNumber() As String
    75. SerialPort.Write("SN")
    76. Return SerialPort.ReadTo(vbCrLf)
    77. End Function
    78. Public Sub Vent()
    79. Dim strData As String
    80. strData = "VENT 1" & vbCr
    81. SerialPort.Write(strData)
    82. _targetPressure = 0
    83. End Sub
    84. Sub New(name As String, comPort As String)
    85. Me.Name = name
    86. SerialPort = New SerialPort(comPort, 9600)
    87. SerialPort.PortName = comPort
    88. End Sub
    89. Public Function GetCurrentPressure() As String
    90. SerialPort.Write("PR")
    91. Dim result = SerialPort.ReadTo(vbCrLf)
    92. Return result
    93. End Function
    94. Public Sub Test(sender As Object, e As EventArgs) Handles SerialPort.DataReceived
    95. End Sub
    96. End Class

    Ich meine, ich weiß man kann nur Variablen mit "WithEvents" deklarieren aber wie kriege ich dass innerhalb meiner Klasse hin? Im programm wäre kein Problem,
    aber manche Mehtoden und FUnktionen meiner Klasses schreiben und lesen vom SerialPort, z.B Public Funkcion GetSerialNumber as String schreibt, liest und gibt SerienNummer as String zurück....

    Ich habe lange darüber gedacht und jetzt drehe ich mich im Kreis....hoffe jemand kann mir hier etwas zur Seite stehen :)

    Jetzt wo ich es nochmal überlege, ist es überhaupt "good-practice" wenn man innerhalb einer Klasse mit SP arbeitet oder soll man das lediglich in Program machen?

    Danke im voraus nochmal :thumbsup:
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.

    rgomez schrieb:

    WithEvents
    Machst Du ganz einfach AddHandler auf die Property:

    VB.NET-Quellcode

    1. Public Property MyPort() As IO.Ports.SerialPort
    2. Public Sub Init()
    3. MyPort = New IO.Ports.SerialPort
    4. AddHandler MyPort.DataReceived, AddressOf MyDataReceived
    5. End Sub
    6. Private Sub MyDataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs)
    7. Throw New NotImplementedException
    8. 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!