Serial Port "kontinuierlich" auslesen Arduino

Gast #5937794
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 #5937854
@ 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
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
@ 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
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

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.