mikrocontroller.net

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


Autor: David 1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
            
SafeSerial ComPort=new SafeSerial();
            ComPort.DataReceived+=ComPort.OnDataReceived;

            ComPort.PortName = "COM1";
            ComPort.BaudRate = 19200;
            ComPort.Parity = System.IO.Ports.Parity.None;
            ComPort.StopBits = System.IO.Ports.StopBits.One;
            ComPort.DataBits = 8;
            ComPort.Handshake = Handshake.RequestToSend;
            ComPort.ReadBufferSize = 16384;
            ComPort.WriteBufferSize = 4096;

            ComPort.Open();
            Thread.Sleep(1000);
            ComPort.Send("ATM0E0X4V1L3\r");
            Thread.Sleep(1000);
            ComPort.Send("ATDT*"+nummer+"\r");
            Thread.Sleep(30000);
            ComPort.Send(Befehl1+"\r");
            Thread.Sleep(1000);
            ComPort.Send(Befehl2+"\r");
            Thread.Sleep(3000);
            ComPort.Send("logout\r");
            Thread.Sleep(5000);
            ComPort.Close();
            Thread.Sleep(3000);
            ComPort.DataReceived -= ComPort.OnDataReceived;
            ComPort=null;
            GC.Collect();
            Thread.Sleep(3000);

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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zwei Möglichkeiten:
Entweder das empfohlene Vorgehen, also warten
http://msdn.microsoft.com/en-us/library/system.io....
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.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: David 1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker Zabe (vza)
Datum:

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

Autor: David 1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
perfekt.
danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.