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:
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
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
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
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
- Public Class Instrument
- Implements IInstrument
- Private _name As String
- Private WithEvents _serialPort As SerialPort
- Private _comPort As String
- Private _category As String
- Private _serienNummer As Integer
- Public Property Name As String Implements IInstrument.Name
- Get
- Return _name
- End Get
- Set
- _name = Value
- End Set
- End Property
- Public Property SerialPort As SerialPort Implements IInstrument.SerialPort
- Get
- Return _serialPort
- End Get
- Set
- _serialPort = Value
- End Set
- End Property
- Public Property ComPort As String Implements IInstrument.ComPort
- Get
- Return _comPort
- End Get
- Set
- _comPort = Value
- End Set
- End Property
- Public Property Category As String Implements IInstrument.Category
- Get
- Return _category
- End Get
- Set
- _category = Value
- End Set
- End Property
- Public Property SerienNummer As Integer Implements IInstrument.SerienNummer
- Get
- Return _serienNummer
- End Get
- Set
- _serienNummer = Value
- End Set
- End Property
- Public Sub TestTest(sender As Object, e As EventArgs) Handles SerialPort.DataReceived
- End Sub
- 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
Quellcode
- Imports System.IO.Ports
- Imports HengesbachMessinstrumente
- Public Class PressureCalibratorPPC
- Inherits Instrument
- Private _targetPressure As Double = 0.0
- Private _controlStatus As String
- Private _pressureUnit As PressureUnit
- Private _comPortConfig As String
- Public Property TargetPressure As Double
- Get
- Return _targetPressure
- End Get
- Set
- Try
- SetTargetPressure(Value)
- _targetPressure = Value
- Catch e As Exception
- Throw New Exception(e.Message)
- End Try
- End Set
- End Property
- Public Property ControlStatus As String
- Get
- Return _controlStatus
- End Get
- Set(value As String)
- _controlStatus = value
- End Set
- End Property
- Friend Property PressureUnit As PressureUnit
- Get
- Return _pressureUnit
- End Get
- Set(value As PressureUnit)
- _pressureUnit = value
- End Set
- End Property
- Public Function GetComPortConfig() As String
- Dim strData = "COM1" & vbCr
- SerialPort.Write(strData)
- Return SerialPort.ReadTo(vbCrLf)
- End Function
- Public Sub SetComPortConfig(baud As Integer, parity As String, dataBits As Integer, stopBits As Integer)
- Dim strData = $"COM1={baud}, {parity}, {dataBits}, {stopBits}"
- SerialPort.Write(strData)
- End Sub
- Public Sub Abort()
- Dim strData = "ABORT" & vbCr
- SerialPort.Write(strData)
- End Sub
- Public Function GetCurrentAtmPressure() As String
- Dim strData = "ATM"
- SerialPort.Write(strData)
- Return SerialPort.ReadTo(vbCrLf)
- End Function
- Public Sub ReturnControlToLocal()
- SerialPort.Write("LOCAL")
- End Sub
- Public Sub Reset()
- End Sub
- Private Sub SetTargetPressure(pressure As Single)
- Dim strData = "PS " & Convert.ToString(pressure, System.Globalization.CultureInfo.InvariantCulture) & vbCr
- SerialPort.Write(pressure)
- End Sub
- Public Function PressureReady() As Boolean
- Dim strData = "SR?" & vbCr
- SerialPort.Write(strData)
- If SerialPort.ReadTo(vbCrLf) = "R" Then
- Return True
- Else
- Return False
- End If
- End Function
- Public Function GetSerialNumber() As String
- SerialPort.Write("SN")
- Return SerialPort.ReadTo(vbCrLf)
- End Function
- Public Sub Vent()
- Dim strData As String
- strData = "VENT 1" & vbCr
- SerialPort.Write(strData)
- _targetPressure = 0
- End Sub
- Sub New(name As String, comPort As String)
- Me.Name = name
- SerialPort = New SerialPort(comPort, 9600)
- SerialPort.PortName = comPort
- End Sub
- Public Function GetCurrentPressure() As String
- SerialPort.Write("PR")
- Dim result = SerialPort.ReadTo(vbCrLf)
- Return result
- End Function
- Public Sub Test(sender As Object, e As EventArgs) Handles SerialPort.DataReceived
- End Sub
- 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
Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.