Forum: PC-Programmierung Serial Port "kontinuierlich" auslesen Arduino


von Henning Huth (Gast)


Lesenswert?

Moin,

ich hab folgendes "gebastelt" ein Rotary Encoder wird per Arduino 
ausgelesen nach Drehrichtung und Anzahl der Klicks. Diesen Wert gebe ich 
dann per am Serial Port des Arduinos aus.

Arduino Code (geschachtelt in If-Scheife -> println wird also nur einmal 
bei Änderung des Encoderwertes "gesendet"):
-----
Serial.println (encoderWert);
-----

Per VB.Net Programm frage ich dann den Wert am Serial-Port alle 100ms 
ab.

Jetzt habe ich das Problem, dass der PC nicht alle Änderungen des 
Encoders empfängt. Anscheinend nur dann, wenn gerade 100ms rum sind und 
der PC am ComPort "schaut" und gleichzeitig am Encoder gedreht wird.

Falls der Encoder gedreht wird und der PC "schaut nicht" in dem Moment 
wird der Wert "verpasst".

Wie bekomme ich da mehr Synchronisation hin. Mir würde nur einfallen, 
den Timer am PC auf 10ms oder noch weniger einzustellen oder den println 
Befehl des Arduinos häufiger zu senden! Ist das wirklich die "richtige" 
Lösung?

von Glaskugel Besitzer (Gast)


Lesenswert?

Henning Huth schrieb:
> Ist das wirklich die "richtige" Lösung?

Programm zeigen, sonst spielen wir Rätselraten.

von Sven K. (quotschmacher)


Lesenswert?


von Dennis (Gast)


Lesenswert?

Programm am PC umprogrammieren.

Oder vom PC aus Aktiv abfragen und auf Antwort warten.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Wo ist jetzt das Problem, dass auf Adruino-Seite der Wert des Encoders 
in einer Variablen gepuffert und dann erst zyklisch gesendet wird?

von Henning Huth (Gast)


Lesenswert?

Sven A. schrieb:
> interrupt statt pollen?

So etwas wäre besser. Leider hab ich schon im Internet gesehen, dass das 
SerialPort.DataReceived Event nicht "richtig" funktionieren soll.
Link:

http://www.sparxeng.com/blog/software/must-use-net-system-io-ports-serialport

(... The DataReceived event (100% redundant, also completely 
unreliable))

Ich werde es trotzdem so probieren.

von Henning Huth (Gast)


Lesenswert?

@ Frank

Das Problem stellt sich so dar:

Unter dem Serial Monitor des Arduinos sieht es so aus, wenn ich den 
Encoder drehe

0 1 2 3 4 5 6 (Encoder im Uhrzeigersinn drehen // jetzt g.Uhrzeigersinn) 
5 4 3 ... alles i.O


Leider ließt er unter VB.Net am Serial Port in etwa so aus
0 5 5 10 8 (im Urzeigersinn // g.Uhrzeigersinn) 8 8 9 2 6 3

von Sly_marbo (Gast)


Lesenswert?

Es Funktioniert afaik schon ziemlich richtig. Aber es unterscheidet 
nicht für dich ob DEINE Nachricht vollständig angekommen ist. Es Meldet 
nur das neue Daten im Buffer sind, ob das der vollständige String ist 
den du gerne sehen möchtest oder nur 1 Zeichen davon, musst du selbst 
checken. Also am Besten noch mit einem Abschlusszeichen oÄ arbeiten um 
sicherzugehen.

von nicht"Gast" (Gast)


Lesenswert?

Glaskugel Besitzer schrieb:
> Henning Huth schrieb:
>> Ist das wirklich die "richtige" Lösung?
>
> Programm zeigen, sonst spielen wir Rätselraten.

Bleibt dabei. Wie sollen wir dir hier Tips geben, wenn kein Code da ist. 
Vielleicht machst du einfach nur was falsch.

von Henning Huth (Gast)


Lesenswert?

@ Glaskugelbesitzer ob das jetzt wirklich so wichtig ist

Polling vom PC per VB.Net:
...
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles 
Timer1.Tick
        Try
            Dim i As Single = SerialPort1.ReadExisting
            LblEncoder.Text = "Encoder Wert : " & i.ToString

        Catch ex As Exception

        End Try
    End Sub
...


Arduino Code:

int messungPin1 = LOW;
int messungPin1Alt = LOW;
int encoderWert = 0;

 void setup() {
 pinMode(3, INPUT);
 pinMode(4, INPUT);
 Serial.begin(9600);
 }

 void loop() {
 messungPin1 = digitalRead(3);
 if ((messungPin1 == HIGH) && (messungPin1Alt == LOW)) {
 if (digitalRead(4) == HIGH) {
 encoderWert++;
 } else {
 encoderWert--;
 }
 Serial.println (encoderWert);
 }
 messungPin1Alt = messungPin1;
 }

von Sven K. (quotschmacher)


Lesenswert?

Henning Huth schrieb:
> Dim i As Single = SerialPort1.ReadExisting

das heißt, wenn dein arduino schon 4 werte geschickt hat steht im buff 
"3, linebreak, 4, linebreak, 5, linebreak, 6, linebreak" und du packst 
das dann alles in eine single-variable. ne idee, wo der fheler liegen 
könnte?

von Keiner N. (nichtgast)


Lesenswert?

zumal ReadExisting einen String zurück gibt und du den in ein single 
quetschen willst.

von Henning (Gast)


Lesenswert?

super ... wenn es wirklich so einfach ist und ich "nur" anstelle
> Dim i As Single = SerialPort1.ReadExisting
Dim i As String ... nehmen muss.

Kann das jetzt gerade nicht mehr testen bin erst ab 17 Uhr wieder da.

Danke für den Hinweis

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.