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
Beitrag "RS232 mit Visual Studio 2003 - C#" Google mal nach Rs232 c+ lib findet man eine Menge Links
Benutzt du System.IO.Ports.Serialport ? Da gibts ein Ereignis namens "DataReceived". Ansonsten nimm nen Timer und poll das ganze.
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?
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.