Hallo, für ein kleines Projekt will ich andauernd Messdaten von einem uC auf meinem PC über die serielle Schnittstelle einlesen! Leider habe ich nun das Problem, dass ich nur einmal etwas zurückbekomme anstatt den andauernden Messwerten. Ich hab mir das so vorgestellt, dass ich zuerst eine "1" Senden muss, dann bekomme ich vom Controller die Antwort "ALles OK Messung startet". Leider kriege ich aber nur diese Nachricht und keine weiteren Messdaten auf meinem selbst programmierten seriellen Port! Das uC sollte stimmmen, da es im Simulator ( Keil ) und auch mit Hyperterminal einwandfrei funktioniert. Habe nun schon sehr sehr viel Zeit reingesetzt und hoffe jemand von euch kann mir helfen! Projekt und der Code als txt sind im Anhang! mfg Florian W.
Ich würde in DataReceived lieber nur .ReadExisting() aufrufen. Mit .ReadLine() blockiert der Thread ggf. wenn im Puffer noch keine komplette Zeile vorhanden ist, könnte vllt. problematisch sein. ...oder mach die ganze Geschichte in einem Thread (bzw. BackgroundWorker) und verwende DataReceived gar nicht. Ansonsten würde ich generell immer: - serialPort.Encoding setzen - serialPort.NewLine setzen
Wie genau funktioniert das den in einem Thread? Hab da jez bisschen gegooglt aber keine Ahnung wie ich das angehen soll :(
Die while - Schleife wird niemals bedient.
1 | |
2 | |
3 | |
4 | |
Zum Threaden für Form - Anwendungen kannst du die Timer - Klasse verwenden. http://msdn.microsoft.com/de-de/library/vstudio/system.windows.forms.timer.aspx
Gast
#2899142
Einfach einen BackgroundWorker aus der Toolbox auf die Form ziehen. Klickt man dann doppelt drauf erzeugt VS die Methode für dessen DoWork-Event. Mittels .RunWorkerAsync() kann der BackgroundWorker gestartet werden, die DoWork()-Methode wird dann in einem eigenen Thread ausgeführt und läuft unabhängig vom GUI-Thread. Da auf Windows.Forms-Elemente aus anderen Threads nicht zugegriffen werden darf, muss man in DoWork() wie auch bei DataReceived mit Invoke arbeiten - oder kann alternativ Daten an den GUI-Thread über die backgroundWorker.ReportProgress()-Funktion übermitteln. http://msdn.microsoft.com/de-de/library/system.componentmodel.backgroundworker(v=vs.80).aspx ...auf youtube gibts auch einige Videos darüber.
Danke dir, werde ich gleich mal ausprobieren
ähm, der DataReceived wird doch nur aufgerufen wenn ich Daten bekomme, odeR? und danke das mit dem ReadExisting hat gut geklappt!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.