Forum: PC-Programmierung Serielles Port in C#


von Florian W. (flo30006)


Angehängte Dateien:

Lesenswert?

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.

von Bernd H. (geeky)


Lesenswert?

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

von Florian W. (flo30006)


Lesenswert?

Wie genau funktioniert das den in einem Thread?
Hab da jez bisschen gegooglt aber keine Ahnung wie ich das angehen soll 
:(

von Rocky B. (bitrocker)


Lesenswert?

Die while - Schleife wird niemals bedient.
1
string RecievedLine = " ";
2
while (RecievedLine != " ")
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

von bluppdidupp (Gast)


Lesenswert?

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.

von Florian W. (flo30006)


Lesenswert?

Danke dir, werde ich gleich mal ausprobieren

von Florian W. (flo30006)


Lesenswert?

ähm, der DataReceived wird doch nur aufgerufen wenn ich Daten bekomme, 
odeR?

und danke das mit dem ReadExisting hat gut geklappt!

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
Noch kein Account? Hier anmelden.