Hallo zusammen,
ich werde hier nicht schlau draus.
Ich sende mit eimem AVR einen String an meine C#-Console:
Serial.print("BumperFrontLeft\r");
In dem C#-Programm kommt das auch so an. Aber nur wenn ich im Debugmodus
einen Breakpoint setzte, und den Wert auslese.
Hier der Auszug:
Wenn ich nun mittels Debug.writeline(msg) zu Laufzeit den String
anschaue, fehlt meistens das erste Zeichen, also "B". Manchmal auch noch
"u". Wenn ich aber den Bumper schnell hintereinander drücke ist das
Ergebnis irgendwann OK. Ich habe hier viele Beträge zu ähnlichen Themen
gefunden, und umgesetzt, aber nun hänge ich.
LG Willi
ist ja auch klar warum.
ReadExisting();
liest du das was da ist, wenn zu diesem Zeitpunkt noch nicht alles da
ist, dann fehlt es.
Es ist oft gar nicht sinnvoll mit dem Event zu arbeiten, wenn du auf die
Daten wartest.
while( true ) {
daten += serialPort1.Read();
//aufwerten von Daten
//danach daten leer machen
}
In deiner serialPort1_DataReceived gehst du davon aus, dass du hier
serialPort1.ReadExisting()
einen kompletten String vom Arduino kriegst. So lange du dein Programm
mit dem Debugger zwischendruch immer wieder mal anhältst, wird das auch
so sein. Nur wenn es dann full-speed läuft, ist dem nicht mehr so.
Und so wie ich das sehe, setzt du die Einzelteile, die bei mehreren
Aufrufen der Funktion jeweils eintrudeln, falsch zusammen.
Geh davon aus, dass beim ersten Aufruf der Funktion von der Seriellen
der String
"Bum"
eingetroffen ist.
Beim nächsten mal liefert ReadExisting
"perFront"
und erst beim dritten mal kommt der dann noch fehlende Rest
"Left\r"
Dein Code muss diese Teilstücke zusammensetzen und erst dann wenn alles
beisammen ist, kannst du mit diesem jetzt kompletten String
weiterarbeiten.
(Streng genommen müsste dein Code auch mit
"Bum"
"perFront"
"Left\rBum"
klar kommen. Wenn also der \r mitten drinnen in dem String steckt, den
du von ReadExisting bekommst. Kommt drauf an, wie schnell der µC seine
Statusupdates rausschickt)
> this.BeginInvoke(new EventHandler(DoUpdate));> serialPort1.DiscardInBuffer();
Holla.
Du kannst doch nicht einfach deinen Buffer verwerfen! In der
Zwischenzeit, die der EventHandler zur Behandlung gebraucht hat, können
doch noch weitere Zeichen eingetrudelt sein. Die Fehlen dir dann
logischerweise.
Danke für die Antworten,
hatte es schon fast vermutet.
@ PeterII: Ich muss aber schon das DataReceived.Event aufrufen, oder?
Wie erfährt das Programm sonst, das eine Taste gedrückt wurde?
@ K.H. Buchegger: "serialPort1.DiscardInBuffer()" Das hatte ich schon
auskommentiert. Ich hatte hier verschiedene Dinge versucht.
Das mit dem "zuammen bauen" werde ich nun mal versuchen.
LGW
Willi K. schrieb:> Ich muss aber schon das DataReceived.Event aufrufen, oder?> Wie erfährt das Programm sonst, das eine Taste gedrückt wurde?
nein, man kann auch einen eigenen thread starten der ständig von dem
com-port daten einliest.
ich muss nun leider zugeben, dass ich das (noch!!)nicht kann. Ich bin in
C# noch nicht so weit. Bin gerade dabei mich in C# einzuarbeiten. Bei
den threads bin ich noch nicht. Dies ist auch "nur" ein Programm um
meinen ersten Bot per BT fern zu steuern. Ist es zuviel verlangt, mir
einen Code zu posten.
Wenn der Bot dann funktioniert, werde ich mich intensiv mit C# befassen.
Versprochen.
LG Willi
Moin moin,
habe mir "fast" die Nacht um die Ohren geschlagen, bin aber hier hängen
geblieben.
bluppdidupp schrieb:
...und den Thread irgendwo starten:
>
1
> Thread t = new Thread(new ThreadStart(this.MeinThread));
2
> t.Start();
3
>
Was meinst Du mit "irgendwo starten"? Ich muss doch ein Ereignis
abwarten, eben das was der Taster auslöst. Wie schon gesagt, ich bin
noch nicht so weit.
LG
Willi
Willi K. schrieb:> Was meinst Du mit "irgendwo starten"?
Na, einfach starten, loslegen lassen, damit der Code auch läuft.
> Ich muss doch ein Ereignis> abwarten, eben das was der Taster auslöst.
Du verwechselst da was.
Ein Thread ist ein zweiter Handlungsfaden innerhalb deines Programms.
Der Thread von da oben der läuft einfach. Wenn er gestartet wird, dann
öffnet er die serielle Schnittstelle und mittels ReadLine wartet er, bis
von der Gegenstelle eine komplette Zeile eingetroffen ist. Die zerlegt
er dann und macht damit, was immer es damit zu machen gibt. Bis er sich
(durch die Schleife) wieder auf die Lauer legt und auf die nächste Zeile
von der Seriellen wartet. Das alles läuft dann völlig unabhängig vom
restlichen Programm.
Wenn du so willst: anstatt dass du alleine eine Arbeit machst, hast du
dir mit dem Thread einen Kumpel eingeladen, dem du Arbeit zuweist und
der die dann alleine bearbeitet. Ab und zu kommt er und sagt: Du hör
mal, da in der Post (serielle Schnittstelle) war die und die Rechnung,
die musst du bearbeiten.
> Wie schon gesagt, ich bin> noch nicht so weit.
Du brauchst ein C# Buch
Guten Morgen Karl Heinz Buchegger,
danke für die Erläuterungen. Habe ich verstanden. Ist "fast" wie ein
Interrupt.
Das Buch habe ich bereits "Visual C# 2010" von Markt und Technik. Bin
hier aber erst auf Seite 159.
Ich bleibe aber dran.
Schönes Wochenende.
Hallo,
so jetzt funktioniert es. Erst einmal danke an alle. Das Zauberwort hieß
"ReadLine" und von der AVR-Seite "Serial.print("....\n").
Alle eure Hinweise haben schlußendlich zum Ziel geführt. Das Theading
war mir noch zu kompliziert. Sorry Karl Heinz Buchegger. Was ich hier
aber gelernt habe, ist das debuggen und die Meldungen genau lesen.
bluppdidupp schrieb:
> .ReadLine() gibt normalerweise den String ohne CR/LF zurück.
stimmt, ist umgesetzt.
Peter II schrieb:
> und ReadLine sollte man nicht im event verwenden. Da soll man nur daten> abrufen die schon vorhanden sind.
Ich denke, hier meinst Du das mit den Threads. Die kann ich, wie gesagt,
noch nicht. Ich empfange einen kompletten String und es funktioniert.
Wenn Du einen andern Weg, ohne Thread weißt, bitte immer her damit.
schönen Sonntag noch
Willi
Problem ist halt, wenn keine komplette Zeile empfangen wurde, wartet ein
Programm im EventHandler bis eine definierte Wartezeit erreicht ist.
Du solltest im EventHandler mit ReadExisting() alle vorhandenen Bytes
einlesen und irgendwo abspeichern, bis dein Zeilenendezeichen empfangen
wurde und dann mit der Verarbeitung der Daten beginnen.