Forum: PC-Programmierung C# Problem mit ComPort Empfang


von Ben S. (theben)


Angehängte Dateien:

Lesenswert?

Ich habe ein Programm in C# geschrieben womit ich mit einem µC 
kommonizieren kenn. Ich schicke zuerst ein Kommando an den µC und warte 
dann in einer whileschleife auf antwort doch diese kommt nie. Nur die 
Fehlermeldung wie auf dem Bild.

Zur Erläuterung des Programms:
zuerst wird ein neuer Tread eröffnet
1
DispensThread = new System.Threading.Thread(new ThreadStart(threadDispens));
2
                DispensThread.Start();
1
private void threadDispens()
2
        {
3
            try
4
            {
5
                serialPortal.Open();
6
            }
7
           catch
8
            {
9
                
10
            }
11
            finally
12
            {
13
                    Inhalt.InititDisp(serialPortal);
14
                    serialPortal.Close();
15
            }
16
        }
in Klasse von Inhalt
1
public bool InititDisp(System.IO.Ports.SerialPort Port)
2
        {
3
            Port.WriteLine("MG");
4
            while (!(PortEmpfangStatus))
5
            {
6
            }


Hat jemand Rat?

von Thomas E. (thomase)


Lesenswert?

Ben S. schrieb:
> Ich habe ein Programm in C# geschrieben
Dann zeig' das auch mal.
Mit deinem Thread-Codefetzen wird der Port geöffnet und geschlossen und 
der Thread läuft ins Leere. Wie willst du damit Daten senden und 
empfangen?

mfg.

von Ben S. (theben)


Lesenswert?

Mit dem Tread wird wird ein relativ großes Programm gestartet welches 
aber relativ immer gleich ab läuft.
Tread Startet
Als erstes öffnen des Ports

dann Kommando senden und auf Empfang (Bestätigung vom µC) warten

danach folgen immer wieder Kommandos mit dem selben Bild

Port schließen
Tread beendet

von Ben S. (theben)


Lesenswert?

Soll ich es noch genauer beschreiben?

von Thomas E. (thomase)


Lesenswert?

Ben S. schrieb:
> Soll ich es noch genauer beschreiben?
Mit dem bisherigen kann man jedenfalls nichts anfangen.

mfg.

von Ben S. (theben)


Lesenswert?

Son Scheiß jetzt hab ichs. Das NewLine Zeichen Hat der Mikrcontroller 
nicht gesendet sondern ein anderes. Komisch aber ist dass mein 
Terminalprogramm dieses Zeichen als NewLine interpretiert hat das mein 
Programm aber nicht.

von bluppdidupp (Gast)


Lesenswert?

Warum benutzt du überhaupt das DataReceived-Event, wenn du eh im Thread 
auf PortEmpfangStatus=true wartest?
Ruf da doch direkt .ReadLine() auf?
Was als Newline erkannt werden soll kann man via .NewLine beim 
SerialPort angeben.
Beim Arbeiten mit Zeichenketten würde ich auch raten .Encoding passend 
setzen (steht standardmässig auf ASCIIEncoding)

von Ralf (Gast)


Lesenswert?

> Komisch aber ist dass mein Terminalprogramm dieses Zeichen als NewLine
> interpretiert hat das mein Programm aber nicht.
Terminalprogramme akzeptieren je nach Einstellung Cr, Lf oder Cr+Lf als 
Endezeichen. Für das COM-Port-Objekt gilt dasselbe, dort ist die 
Einstellung "Newline-Character" (oder so ähnlich) der Ansatzpunkt, der 
Defaultwert ist "/n", wenn ich mich recht entsinne, und das wiederum ist 
systemabhängig.

Ralf

von Sven H. (dsb_sven)


Lesenswert?

bluppdidupp schrieb:
> wenn du eh im Thread
> auf PortEmpfangStatus=true wartest?

Wo steht das?

von bluppdidupp (Gast)


Lesenswert?

Sven H. schrieb:
> Wo steht das?
1
while (!(PortEmpfangStatus))
2
{
3
}
...sieht für mich nach aktivem Warten aus. In der DataReceived 
(Screenshot) setzt er PortEmpfangStatus auf true (2x sogar?!)

von Sven H. (dsb_sven)


Lesenswert?

bluppdidupp schrieb:
> Sven H. schrieb:
>> Wo steht das?
>
>
1
> while (!(PortEmpfangStatus))
2
> {
3
> }
> ...sieht für mich nach aktivem Warten aus. In der DataReceived
> (Screenshot) setzt er PortEmpfangStatus auf true (2x sogar?!)

Allerdings wird PortEmpfangStatus nie gesetzt, weil das Programm in der 
Schleife hängt und der EventHandler nie aufgerufen wird...

von Bernd H. (geeky)


Lesenswert?

Sven H. schrieb:
> Allerdings wird PortEmpfangStatus nie gesetzt, weil das Programm in der
> Schleife hängt und der EventHandler nie aufgerufen wird...

Da bin ich grad nicht so sicher. Die SerialPort-Klasse startet selbst 
Threads, der DataReceived-Eventhandler wird parallel zum "Main"-Thread 
ausgeführt.

von Sven H. (dsb_sven)


Lesenswert?

Aber nicht, wenn das Programm 100% CPU Last in der While Schleife 
erzeugt. Dann wird kein Event ausgelöst.

von Bernd H. (geeky)


Lesenswert?

Natürlich laufen andere Threads weiter, wenn ein anderer Thread für hohe 
CPU-Last sorgt? Selbst Thread mit ThreadPriority.Lowest kriegen noch 
minimal was ab...

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.
Lade...