Serial Port "kontinuierlich" auslesen Arduino

Gast #5937794
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?
Gast #5937850
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.
Gast #5937854
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
Gast #5937871
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.
Gast #5937894
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;
 }
Gast #5938066
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren