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?
Henning Huth schrieb: > Ist das wirklich die "richtige" Lösung? Programm zeigen, sonst spielen wir Rätselraten.
interrupt statt pollen? https://docs.microsoft.com/de-de/dotnet/api/system.io.ports.serialport.datareceived?view=netframework-4.8
Programm am PC umprogrammieren. Oder vom PC aus Aktiv abfragen und auf Antwort warten.
Wo ist jetzt das Problem, dass auf Adruino-Seite der Wert des Encoders in einer Variablen gepuffert und dann erst zyklisch gesendet wird?
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.
@ 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
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.
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.
@ 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; }
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?
zumal ReadExisting einen String zurück gibt und du den in ein single quetschen willst.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.