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

Gast #1735668
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.
#1735775
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.
Gast #1735792
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?
Gast #1735837
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren