mikrocontroller.net

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


Autor: RizzoRat (Gast)
Datum:

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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "RS232 mit Visual Studio 2003 - C#"

Google mal nach

 Rs232 c+ lib

findet man eine Menge Links

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Benutzt du System.IO.Ports.Serialport ?
Da gibts ein Ereignis namens "DataReceived".

Ansonsten nimm nen Timer und poll das ganze.

Autor: RizzoRat (Gast)
Datum:

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

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Windows-Form oder Konsole?

Autor: RizzoRat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
windows forms. Das ganze sieht atm so aus:
 private void button4_Click(object sender, EventArgs e)
        {
            
            //Funktionsaufrufe die alle Daten vorbereiten und an MSP senden

            Datensollen per SerialPort empfangen werden und jeder Datensatz verarbeitet werden.
           
           
        }


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.

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

Bewertung
0 lesenswert
nicht 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:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

        }

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

Autor: Markus Volz (Gast)
Datum:

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

Autor: Willivonbienemaya .. (willivonbienemaya)
Datum:

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

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.