Mehrere Com-Ports verwenden

  • VB.NET
  • .NET (FX) 4.0

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

    Mehrere Com-Ports verwenden

    Moin,moin.

    Ich bin gerade dabei eine Oberfläche zu erstellen, mit der 7 Messgeräte angesteuert werden können.
    Diese sind alle an einem seriellen Port geknüpft.

    Da ich ungern für jeden Port einzelne Routinen benutzen möchte, dachte ich an die Verwendung einer Listof, in der die Ports vorhanden sind.

    Ich habe (nur als Beispiel hier für Port 0) diese Routine benutzt, um den (die) Port(s) zu erstellen:

    Quellcode

    1. Dim ComPort As New List(Of IO.Ports.SerialPort)
    2. ComPort.Add(New SerialPort)
    3. With ComPort(0)
    4. .PortName = "Com13"
    5. .BaudRate = 57600 'BaudRate1
    6. .Parity = Parity.Odd
    7. .DataBits = 8
    8. .StopBits = StopBits.One
    9. .Handshake = Handshake.None
    10. .RtsEnable = False
    11. .DtrEnable = True
    12. ' Set the read/write timeouts
    13. .ReadTimeout = 3000
    14. .WriteTimeout = 3000
    15. .ReceivedBytesThreshold = 1
    16. .ReadBufferSize = 4096
    17. ComPort(0).Open()
    18. End With


    Das funktioniert auch soweit.
    Jetzt brauche ich noch einen Datareceive Handler, welchen ich so erstellt habe:

    Quellcode

    1. AddHandler ComPort(0).DataReceived, AddressOf Empfang0


    Allerdings kann ich in Empfang0, den ComPort(0) nicht benutzen, da dieser nicht deklariert ist:

    Quellcode

    1. Sub Empfang0(ByVal obj As Object, ByVal evtArgs As SerialDataReceivedEventArgs) 'Handles ComPort(0).DataReceived
    2. ' Anzahl der zur Verfügung stehenden Bytes erfassen
    3. Bytecount = ComPort(0).BytesToRead <-- Nicht deklariert !


    Mache ich es so:

    Quellcode

    1. AddHandler ComPort(0).DataReceived, Sub(obj As Object, evtArgs As SerialDataReceivedEventArgs)
    2. ' Anzahl der zur Verfügung stehenden Bytes erfassen
    3. Bytecount = ComPort(0).BytesToRead
    4. End Sub

    dann kann ich auf ComPort(0) zugreifen.

    Ich möchte das DataReceive aber nicht innerhalb der ComPort-Erstellung haben, sondern als eigene Sub.


    Die Frage wäre:
    Wie kann ich das DataReceive in einer eigenen Sub benutzen und was mache ich bei der Zuweisung / Verwendung falsch ? ?(
    Wie "dröselt" man AddHandler ComPort(0).DataReceived, Sub(obj As Object, evtArgs As SerialDataReceivedEventArgs)
    quasi in seine Bestandteile ?
    @Digtro_77 Ich würde das so machen (nicht getestet):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim ComPort As New List(Of IO.Ports.SerialPort)
    2. Dim SinglePort = New SerialPort()
    3. With SinglePort
    4. .PortName = "Com13"
    5. .BaudRate = 57600 'BaudRate1
    6. .Parity = Parity.Odd
    7. .DataBits = 8
    8. .StopBits = StopBits.One
    9. .Handshake = Handshake.None
    10. .RtsEnable = False
    11. .DtrEnable = True
    12. ' Set the read/write timeouts
    13. .ReadTimeout = 3000
    14. .WriteTimeout = 3000
    15. .ReceivedBytesThreshold = 1
    16. .ReadBufferSize = 4096
    17. .Open()
    18. End With
    19. AddHandler SinglePort.DataReceived, SinglePort_DataReceived
    20. ComPort.Add(SinglePort)
    21. ' ...
    22. Private Sub SinglePort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)
    23. ' Anzahl der zur Verfügung stehenden Bytes erfassen
    24. Dim port = DirectCast(sender, SerialPort)
    25. Bytecount = port.BytesToRead
    26. End Sun
    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!