Laden...

Verständnis Serialport Events

Erstellt von Rizzo vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.454 Views
Thema geschlossen
R
Rizzo Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren
Verständnis Serialport Events

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

N
191 Beiträge seit 2007
vor 15 Jahren

        protected void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
// Hier dein Code
        }

im Konstruktor:


            this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);

Ist es das was du suchst?
Das ENDE könntest evtl. über einen Timeout lösen


                serialPort1.ReadTimeout = 1;

Das ganze dann evtl. noch abfangen


                    catch (TimeoutException)
                    {
                        if (serialPort1.IsOpen)
                        {
                            serialPort1.Close();
                        }
                    }

"If you give someone a
program, you will frustrate them
for a day; if you teach them how to
program, you will frustrate them
for a lifetime." :evil:

R
Rizzo Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

Das sieht schon ziemlich danach aus wie ich das haben will.

Ich hab mir ne windows Forms gui anwendung gebastelt und alle Funktionen für die Datenverarbeitung und das USB Interface ausgelagert in separate Klassen (der übersicht halber)

Wo kommen die dann hin? atm sieht das so aus:

private void button4_Click(object sender, EventArgs e)
        {
           //Daten werden aus txt Datei ausgelesen, aufbereitet

            Interface.Daten_senden(Data1, Data2);

            //jetzt soll das programm in den von mir beabsichtigten Wartezustand verfallen und dann immer Den ankommenden Stringt, der alle X sekunden ankommt verarbeiten.



N
191 Beiträge seit 2007
vor 15 Jahren

Hmm... Ganz hab ich dich nicht verstanden, aber versuch mal ob dir das was bringt:


protected void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            button4_Click(null, null);
        }

"If you give someone a
program, you will frustrate them
for a day; if you teach them how to
program, you will frustrate them
for a lifetime." :evil:

R
Rizzo Themenstarter:in
5 Beiträge seit 2008
vor 15 Jahren

JA vielelich tetwas missverständlich ausgedrückt. Ich hab noch ned viel Erfahrung mit C# und hangel mich da derzeitig bissel durch.

Also:

In meinem Programm gibt man zu erst per OpenFileDialog ne txt Datei an, in der nen Haufen Datensätze liegen.

Klickt man auf Button 4 werden erstmal alle Funktionen aufgerufen die zum Auslesen und zur aufbereitung der Daten nötig sind damit ich sich per SerialPort an mein Board senden kann.

Dann werden die Daten gesendet

Bis hier hin funktioniert bereits alles einwandfrei.

Es existieren 2 Klassen die ich selber geschrieben habe einmal "interface" hier steht bis jetzt alles drinne was mit dem Senden zu tun hat und "Data" hier sind alle Funktione enthalten was das lesen und schreiben der txt datei angeht.

Mein Problem bei deiner Antwort ist jetzt, Was ich genau wo tun muss um diese Eventabfrage zu machen.

protected void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           //code
        }
this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);

Muss das in meine Interface classe und dann als funktion aufgerufen werden? oder wie läuft das? Mir gehts einfach darum das ich ned kapiere wo ich das teil hinschreiben muss (ich denke mal ned in meine form datei, da rufe ich ja sache nur auf). Oder wird die funktion jedesmal aufgerufen wenn da was passiert, egal ob sie in dem buttonclick block ned vorkommt?

N
191 Beiträge seit 2007
vor 15 Jahren

this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);

Kommt in den Konstruktor deiner Form. Ich nehm mal an das du in dieser auch deinen Port instanzierst, oder?


protected void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           //Wird getriggert sobald etwas über den seriellen Port rein kommt
        }

Kommt dann in den Code deiner Form.
Du schreibst dann dort alles rein, was passieren muss, sobald etwas über deinen seriellen Port ankommt.

"If you give someone a
program, you will frustrate them
for a day; if you teach them how to
program, you will frustrate them
for a lifetime." :evil:

179 Beiträge seit 2006
vor 15 Jahren
49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Rizzo,

geschlossen wegen Crosspost. Siehe [Hinweis] Wie poste ich richtig? Punkt 2.

herbivore

Thema geschlossen