mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Henning Huth (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Glaskugel Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Henning Huth schrieb:
> Ist das wirklich die "richtige" Lösung?

Programm zeigen, sonst spielen wir Rätselraten.

Autor: Sven A. (quotschmacher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Dennis (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Programm am PC umprogrammieren.

Oder vom PC aus Aktiv abfragen und auf Antwort warten.

Autor: Frank E. (Firma: Q3) (qualidat)
Datum:

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

Autor: Henning Huth (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henning Huth (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sly_marbo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nicht"Gast" (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Henning Huth (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
 }

Autor: Sven A. (quotschmacher)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Keiner N. (nichtgast)
Datum:

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

Autor: Henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.