Wird ein Comport automatisch geschlossen?

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von fraju.

    Wird ein Comport automatisch geschlossen?

    Hi,

    ich wollte mal fragen, ob ein Comport automatisch geschlossen wird, wenn dieser längere Zeit (ungenutzt) offen bleibt. Ich schreibe z.zt ein Programm, welches, wenn es einen Fehler gibt, eine LED einschaltet. (Vielen dank an fraju für die Bereitstellung des BITWACKELN-Codes.) Wenn das Programm gestartet wird, wird ganz am Anfang des Programm der Comport geöffnet. Gute 3 Minuten nach dem Programmstart, wird dann die LED mit dem Befehl led.an() eingeschaltet. Wen dies geschehen soll, erhalte ich eine Fehlermeldung, dass der Comport geschlossen ist. Das merkwürdige an der Sache ist nur die Tatsache, dass die Fehlermeldung nicht kommt, wenn man den Befehl led.an() mit einem Button aufruft?!? Die LED wird von einer Klasse eingeschaltet, welche auch die Logdatei schreibt.

    VB.NET-Quellcode

    1. '###################################################
    2. '### ErrorLED Class by Floriware, fGojH. in 2010 ###
    3. '###################################################
    4. 'Für LED an Pin 3 (Breakstate) und 5 (Signal Ground).
    5. Public Class ErrorLED
    6. Dim com As String
    7. Dim noini As Boolean
    8. Dim SerialPort As New System.IO.Ports.SerialPort
    9. Public Sub initiate()
    10. com = "COM1"
    11. noini = False
    12. 'Gibt den zu verwendenden Comport an.
    13. SerialPort.PortName = com
    14. Try
    15. SerialPort.Open()
    16. Catch ex As Exception
    17. Form1.logweitergabe(33)
    18. noini = True
    19. Exit Sub
    20. End Try
    21. If noini = False Then An()
    22. Aus()
    23. End Sub
    24. Public Sub An()
    25. 'Try
    26. SerialPort.BreakState = True
    27. 'Catch ex As Exception
    28. ' Form1.logweitergabe(34)
    29. 'End Try
    30. End Sub
    31. Public Sub Aus()
    32. If noini = False Then
    33. Try
    34. SerialPort.BreakState = False
    35. Catch ex As Exception
    36. Form1.logweitergabe(35)
    37. End Try
    38. End If
    39. End Sub
    40. Public Function istan()
    41. If noini = False Then
    42. Return SerialPort.BreakState
    43. Else
    44. Return "FEHLER"
    45. End If
    46. End Function
    47. Public Sub noinitial()
    48. SerialPort.Close()
    49. noini = True
    50. Form1.logweitergabe(38)
    51. End Sub
    52. End Class
    Hallo
    Das Prog solltest du nicht Überbewerten,ist einfach und hat Fehler.
    Sollte nur als erste Hilfe gelten.

    Beim benutzen von TxD mußt du beachten ,dass beim betätigen der beiden anderen Ausgänge
    TxD zurückgesetzt wird.
    Ich benutze Tx als Imp.Ausgabe(Strobe) für 4094
    Ich würde einen der beiden anderen Ausgänge zum schalten der Led nutzen.
    Wie ich informiert bin wird die Com nicht von alleine Verändert.
    Vielleicht greift ein Anderes Prog noch auf die Schnittstelle zu.

    Gruß
    Hab inzwischen mehr oder weniger rausgefunden, woran es lag. Vielleicht kann mir jemand das Symptom genauer erklären.

    Im Code von Form 1 wird auf die LED Klasse mit so zugegriffen: (Beispiel)

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim log As New LogControl
    3. Dim led As New ErrorLED
    4. Private Sub neu()
    5. led.an()
    6. End Sub
    7. End Class


    Im Code der LogControl Klasse wird genauso darauf zugegriffen: (Beispiel)

    VB.NET-Quellcode

    1. Public Class LogControl
    2. Dim led As New ErrorLED
    3. Private Sub neu()
    4. led.an()
    5. End Sub
    6. End Class


    Wenn jetzt die LED von Form1 gestartet werden soll, funktionierts, wird sie hingegen von LogControl aufgerufen, funktionierts nicht und ich bekomme den Fehler, dass der ComPort nicht geöffnet ist.

    Habe jetzt das Problem so gelöst:

    VB.NET-Quellcode

    1. Public Class LogControl
    2. Dim led As New ErrorLED
    3. Private Sub neu()
    4. Form1.ledweitergabe(True)
    5. End Sub
    6. End Class


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim log As New LogControl
    3. Dim led As New ErrorLED
    4. Private Sub neu()
    5. led.an()
    6. End Sub
    7. Public Sub ledweitergabe(ByVal ledan As Boolean)
    8. If ledan = True Then led.An() Else led.Aus()
    9. End Sub
    10. End Class


    Wieso kann man also die LED einschalten, wenn man dies von Form1 aus tut und warum nicht, wenn man es von LogControl aus tut?

    PS: Ein Comport wird nicht automatisch geschlossen. Habs mit nem anderen selbstgeschriebenen Programm und der ErrorLED Klasse probiert und der Port blieb ne viertel Stunde offen, bis ich den Versuch abgebrochen habe.
    PS: Ein Comport wird nicht automatisch geschlossen.
    Beim Beenden des Prozesses, der den COM-Port geöffnen hat, wird er automatisch geschlossen IIRC. Wer dafür verantwortlich ist, die jeweilige Entwicklungsumgebung bzw. der Garbage Collector oder das Betriebssystem selbst, weiß ich aber nicht.

    Zu deinem Problem: ich vermute du versuchst den Com-Port 2x zu öffnen. Die beiden Instanzen der Klasse sind voneinander komplett unabhängig. (Bzw. scheinst du ja schon einen Ansatz dahingehend zu haben.)
    Ein sauberer Lösungsansatz wäre es eine SerialControl Klasse o.Ä. zu erstellen und diese dann an die LED Klasse zu übergeben (im Constructor), oder der LogControl Klasse die LED-Klasse zu übergeben. Wenn du nicht-konstante Variablen im Constructor benötigst, dann kannst du das As New jedoch nicht verwenden. Den COM-Port jedes mal wieder zu schließen halte ich nicht wirklich für sinnvoll, es sei denn du willst den Port unter mehreren Anwendungen teilen.

    Mal ein grobes Beispiel, das beide o.g. Lösungsansätze beinhaltet:

    VB.NET-Quellcode

    1. ' Die Form, bzw. der Eintrittspunkt des Programmes
    2. Public Class Form1
    3. Private com as COMControl
    4. Private led as ErrorLED
    5. Private log as LogControl
    6. Public Sub New()
    7. com = new COMControl(...)
    8. led = new ErrorLED(com)
    9. log = new LogControl(led)
    10. com.DoSomethingWithoutTheLedClass()
    11. End Sub
    12. End Class
    13. ' die LED-Klasse mit Constructor
    14. Public Class ErrorLED
    15. Private com as COMControl
    16. Public Sub New(existingCom as COMControl)
    17. com = existingCom
    18. End Sub
    19. Public Sub an()
    20. com.DoSomething()
    21. End Sub
    22. Public Sub aus()
    23. com.DoSomethingElse()
    24. End Sub
    25. End Class
    26. ' die Log-Klasse mit Constructor
    27. Public Class LogControl
    28. Private led as ErrorLED
    29. Public Sub New(errLed as ErrorLED)
    30. led = errLed
    31. End Sub
    32. Public Sub DoSomething()
    33. led.an()
    34. End Sub
    35. End Class