Forum: PC-Programmierung Serialport C#: Probleme beim Schließen vom COM-Port


von David 1 (Gast)


Lesenswert?

Hallo,

Ich möchte über eine Modemverbindung, welche über ein COM-Port 
angesteurt wird, nacheinander zu mehrere Geräten verbinden.
Die Verbindung funktioniert ganz gut, mein Problem ist nur das neue 
Anwählen des nächsten Gerätes.
Und zwar ist obwohl ich den Comport geschlossen habe, immer noch die 
Verbindung zu dem vorangegangenden Gerät aktiv.
Wenn ich jetzt AT-Befehle benutzen will, probiert der mikrocontroller an 
der anderen Seite diese zu verstehen, anstatt das nächse Gerät 
anzuwählen.

Ich hab das Problem mal auf Minimum runtergebrochen (siehe Code) und 
habe schon folgenden Beitrag berücksichtig: 
TitelBeitrag "Re: Suche C# Profi!"

Der Code wir in einer Schleife 5 mal hintereinader aufgerufen.
1
            
2
SafeSerial ComPort=new SafeSerial();
3
            ComPort.DataReceived+=ComPort.OnDataReceived;
4
5
            ComPort.PortName = "COM1";
6
            ComPort.BaudRate = 19200;
7
            ComPort.Parity = System.IO.Ports.Parity.None;
8
            ComPort.StopBits = System.IO.Ports.StopBits.One;
9
            ComPort.DataBits = 8;
10
            ComPort.Handshake = Handshake.RequestToSend;
11
            ComPort.ReadBufferSize = 16384;
12
            ComPort.WriteBufferSize = 4096;
13
14
            ComPort.Open();
15
            Thread.Sleep(1000);
16
            ComPort.Send("ATM0E0X4V1L3\r");
17
            Thread.Sleep(1000);
18
            ComPort.Send("ATDT*"+nummer+"\r");
19
            Thread.Sleep(30000);
20
            ComPort.Send(Befehl1+"\r");
21
            Thread.Sleep(1000);
22
            ComPort.Send(Befehl2+"\r");
23
            Thread.Sleep(3000);
24
            ComPort.Send("logout\r");
25
            Thread.Sleep(5000);
26
            ComPort.Close();
27
            Thread.Sleep(3000);
28
            ComPort.DataReceived -= ComPort.OnDataReceived;
29
            ComPort=null;
30
            GC.Collect();
31
            Thread.Sleep(3000);

Vielleicht hatte schon jemand ähnliche Probleme oder sieht den Fehler.

von Arc N. (arc)


Lesenswert?

Zwei Möglichkeiten:
Entweder das empfohlene Vorgehen, also warten
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.close.aspx
oder
für jede Schnittstelle eine eigene Instanz der Klasse SafeSerial 
benutzen.
Das Problem bzw. eigentlich ein übliches Vorgehen bei Close ist 
folgendes:
Close() ruft nur das Dispose() der Basisklasse auf, macht aber sonst 
nichts d.h. irgendwann kommt der GC und fängt an aufzuräumen. U.a. 
irgendwann beim SerialStream des Serialports, dieser Stream versucht 
dann den internen Thread zu stoppen und irgendwann ist auch der 
Basis-Stream dran. Das kann dauern.

von tuppes (Gast)


Lesenswert?

Warum musst du denn nach jedem Anruf den COM-Port schließen und für den 
nächsten neu öffnen? Kannst du nicht einfach einhängen (ATH), dann 
warten bis der Träger weg ist (Carrier Detect) und neu wählen?

von David 1 (Gast)


Lesenswert?

@tuppes:
ich will ja gnenau das erreichen was du sagst. Aber die Verbindung ist 
ja nicht mehr zum Modem sondern zu meinen Mikrocontroller.

Ich würde gerne dem Modem per Software sagen das es auflegen soll.

von Volker Z. (vza)


Lesenswert?

War da mal nicht was mit "+++" und dann warten?

von David 1 (Gast)


Lesenswert?

perfekt.
danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.