Forum: PC-Programmierung C# SerialPort Events Verständis


von RizzoRat (Gast)


Lesenswert?

Hallo zusammen

ich sitze gerade an meinem ersten größeren Projekt. Ich hab mir ein PCB 
gebastelt, das funzt auch alles wunderbar, als Datenschnittstelle 
benutze ich den FT232BL von FTDI.

Auf dem PC sind die CDM Treiber installiert, wo ich den Virtuellen 
Comport Teil von verwende.

Derzeitig ist es so, das ich daten in einer TXT datei speichere, dieser 
werden von meinem C# Programm ausgelesen und an den Mikrocontroller 
übermittelt, damit dieser seine arbeit beginnen kann. DAs funktioniert 
auch.

Jetzt folgende Verstädnisfrage:

Nachdem ich die Funktion ausgeführt habe, die die Daten an den MSP430 
übermittelt hat, soll das Programm in eine Art Ruhezustand verfallen, 
und auf das Event reagieren, das neue Daten im Eingangspuffer gelandet 
sind.

Es wird so sein das mein MSP alle X sekunden einen String sendet, den 
ich im Programm verarbeiten will und dann abspeichern will. Wie diese 
Verarbeitung laufen soll ist schon alles fertig, nur wie das mit dem 
Ruhezustand laufen soll, bzw so einer art Eventhandler ist mir nicht 
vollständig klar.

Ich will ja nicht ne endlos whileschleife laufen lassen die 100% cpu 
last dann erzeugt, sondern einfach einen Ereignisorientierten Aufruf 
einer Funktion, oder eine Funktion die ich aufrufe, und solange aktive 
bleibt bis ich durch den Mikrocontroller ein "Ende" sende.


Hat sowas jemand schonmal in C# gemacht? bzw kann mir einer erklären wie 
das laufen soll?

gez.
     RizzoRat

von ... .. (docean) Benutzerseite


Lesenswert?

Beitrag "RS232 mit Visual Studio 2003 - C#"

Google mal nach

 Rs232 c+ lib

findet man eine Menge Links

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Benutzt du System.IO.Ports.Serialport ?
Da gibts ein Ereignis namens "DataReceived".

Ansonsten nimm nen Timer und poll das ganze.

von RizzoRat (Gast)


Lesenswert?

Ja ich benutze die System.IO.Ports.Serialport. Und von dem DataRecieved 
ereignis habe ich auch schon gelesen, mir gehts um die Struktur des 
Programes, wie mache ich eine Funktion von dieses DataRecieved abhängig?

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Windows-Form oder Konsole?

von RizzoRat (Gast)


Lesenswert?

windows forms. Das ganze sieht atm so aus:
1
 private void button4_Click(object sender, EventArgs e)
2
        {
3
            
4
            //Funktionsaufrufe die alle Daten vorbereiten und an MSP senden
5
6
            Datensollen per SerialPort empfangen werden und jeder Datensatz verarbeitet werden.
7
           
8
           
9
        }


Quasi werden erstmala lle Sachen vorbereitet und dann soll er halt in 
diesen von mir beabsichtigeten wartezustand fallen udn jedesmal wenn 
daten kommen die funktionen aufrufen, die die den string zerlegen 
verarbeiten und wegspeichern.

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

ok.
ich versteh jetzt nicht wo das problem ist.
Du hast eine Funktion mit der die Daten gesendet werden.

Das empfangen kannst du ja dann in dem genannten Ereignis tun:
1
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
2
        {
3
4
        }

Und wie willst du da jetzt die CPU auf 100% bekommen? Da is doch 
nirgends ne Schleife, gesschweige denn ne endlose.

von Markus Volz (Gast)


Lesenswert?

Hi RizzoRat!

Wenn ich Dein Problem richtig verstanden habe, willst Du im 
Hauptprogramm auf ein Event warten, das anzeigt, daß die Daten vom 
MSP430 vollständig übertragen wurden und zur Verarbeitung anstehen. Du 
weißt allerdings nicht, welches Event Du dazu verwenden kannst.

Für solche Zwecke gibt es im Namespace System.Threading die Klassen 
AutoResetEvent bzw. ManualResetEvent. Du erzeugst im Hauptprogramm eine 
Instanz einer solchen Klasse. Wichtig ist, daß sowohl das Hauptprogramm 
als auch ein Thread, der das asynchrone Empfangen der Daten vom MSP430 
erledigt, Zugriff auf dieses Event-Objekt haben. Am Ende der 
Initialierung des Hauptprogrammes startest Du Deinen Daten-Lese-Thread, 
der das Event triggert, sobald ein Datensatz vollständig vorliegt 
(Aufruf der Set-Methode des Event-Objekts). Das Hauptprogramm wartet 
während dessen darauf, daß das Event vom Thread getriggert wird (Aufruf 
von WaitOne des Event-Objekts).

Sowohl die Verarbeitung als auch das Lesen der Daten vom MSP430 kannst 
Du natürlich in einer Schleife ausführen. Wichtig wäre am Ende des 
Hauptprogramms, daß Du die Thread-Schleife vom Hauptprogramm aus 
beendest und mit dem Aufruf der Methode Join() des Thread-Objekts darauf 
wartest, daß der Thread sich tatsächlich beendet.

Gruß
Markus

von Willivonbienemaya .. (willivonbienemaya)


Lesenswert?

Markus Volz wrote:
> Für solche Zwecke gibt es im Namespace System.Threading die Klassen
> AutoResetEvent bzw. ManualResetEvent. Du erzeugst im Hauptprogramm eine
> Instanz einer solchen Klasse. Wichtig ist, daß sowohl das Hauptprogramm
> als auch ein Thread, der das asynchrone Empfangen der Daten vom MSP430
> erledigt, Zugriff auf dieses Event-Objekt haben. Am Ende der
> Initialierung des Hauptprogrammes startest Du Deinen Daten-Lese-Thread,
> der das Event triggert, sobald ein Datensatz vollständig vorliegt
> (Aufruf der Set-Methode des Event-Objekts). Das Hauptprogramm wartet
> während dessen darauf, daß das Event vom Thread getriggert wird (Aufruf
> von WaitOne des Event-Objekts).

Viel zu kompliziert. Er verwendet den Serialport, der hat schon ein 
passendes Event.
Siehe: Beitrag "Re: C# SerialPort Events Verständis"

> Sowohl die Verarbeitung als auch das Lesen der Daten vom MSP430 kannst
> Du natürlich in einer Schleife ausführen. Wichtig wäre am Ende des
> Hauptprogramms, daß Du die Thread-Schleife vom Hauptprogramm aus
> beendest und mit dem Aufruf der Methode Join() des Thread-Objekts darauf
> wartest, daß der Thread sich tatsächlich beendet.

Er benutzt Windows-Forms. Es gibt hier kein Hauptprogramm im klassischen 
Sinn.

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.