Du bist nicht angemeldet.

iKoze

Registrierter Benutzer

  • »iKoze« ist der Autor dieses Themas

Beiträge: 5

Dabei seit: 26. Mai 2010

  • Private Nachricht senden

1

Dienstag, 10. August 2010, 19:00

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.

Visual Basic Quellcode

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

fraju

Steinalter Anfänger

Beiträge: 1 365

Dabei seit: 23. Februar 2009

Hilfreich-Bewertungen: 26

  • Private Nachricht senden

2

Dienstag, 10. August 2010, 21:28

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ß

iKoze

Registrierter Benutzer

  • »iKoze« ist der Autor dieses Themas

Beiträge: 5

Dabei seit: 26. Mai 2010

  • Private Nachricht senden

3

Dienstag, 10. August 2010, 22:34

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)

Visual Basic Quellcode

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


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

Visual Basic Quellcode

1
2
3
4
5
6
Public Class LogControl
 Dim led As New ErrorLED
Private Sub neu()
   led.an()
End Sub
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:

Visual Basic Quellcode

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


Visual Basic Quellcode

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

Mad Andy

Registrierter Benutzer

  • »Mad Andy« ist männlich

Beiträge: 4 451

Dabei seit: 2. August 2004

Wohnort: Österreich / Wien

Hilfreich-Bewertungen: 13

  • Private Nachricht senden

4

Donnerstag, 12. August 2010, 02:25

Zitat

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:

Visual Basic Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
' Die Form, bzw. der Eintrittspunkt des Programmes
Public Class Form1
  Private com as COMControl
  Private led as ErrorLED
  Private log as LogControl

  Public Sub New()
    com = new COMControl(...)
    led = new ErrorLED(com)
    log = new LogControl(led)
    
    com.DoSomethingWithoutTheLedClass()
  End Sub
End Class


' die LED-Klasse mit Constructor
Public Class ErrorLED
  Private com as COMControl
  
  Public Sub New(existingCom as COMControl)
    com = existingCom
  End Sub
  
  Public Sub an()
     com.DoSomething()
  End Sub
  
  Public Sub aus()
    com.DoSomethingElse()
  End Sub
End Class


' die Log-Klasse mit Constructor
Public Class LogControl
  Private led as ErrorLED
  
  Public Sub New(errLed as ErrorLED)
    led = errLed
  End Sub
  
  Public Sub DoSomething()
    led.an()
  End Sub
End Class

fraju

Steinalter Anfänger

Beiträge: 1 365

Dabei seit: 23. Februar 2009

Hilfreich-Bewertungen: 26

  • Private Nachricht senden

5

Donnerstag, 12. August 2010, 07:54

ich wollte mal fragen, ob ein Comport automatisch geschlossen wird, wenn dieser längere Zeit (ungenutzt) offen bleibt.


Hallo Mad

Wieder mal als Nachtmensch unterwegs. :)

Meine Antwort bezog sich auf das Zitat.
Also Com schließen,ohne Prozess zu beenden.

Gruß

Verwendete Tags

Rs232

Social Bookmarks