Interessant wäre es noch, wie das Ganze Arduino Seitig aussieht. Ich werde das Gefühl nicht los, das bei dir der UART Puffer überläuft.
Was für ein Arduino verwendest du ?
Ich bin momentan auch an einem Messprogramm am schreiben.
Dort werden pro Sekunde 500x 2 Int16 in beide Richtungen übertragen.
Synapse Com-Auslesen: Daten werden zeitversetzt angezeigt
-
- Beiträge: 6917
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig
Und, wie sieht denn das Programm aktuell aus? Raten kann man viel...lazarus_fan hat geschrieben:Also, neue Erkenntnis: die Verzögerung steigt mit der Laufzeit des Programmes.
Ich verarbeite Datenpakete die mit 57kBaud kommen ohne Verzögerung. Am Prozessor wird es kaum liegen. Und einen 16kByte Readbuffer bekommt ein Arduino auch nicht so schnell voll, dass der Prozessor nicht mehr hinterherkäme. Bei 19kBaud würde ja schon das Vollschreiben des Buffers 8sec dauern, wenn der Arduino pausenlos senden würde.
-
- Beiträge: 15
- Registriert: Mi 28. Dez 2016, 21:13
Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig
geraten werden braucht nicht, Programm steht oben im ersten Post von mir.
Habe die sleep weggelassen, jetzt kommt es aber ab und an zu Problemen mit der Schnittstelle, sie "empfängt" irgendwie falsche Daten und das Programm meckert dann beim Start
es liegt eindeutig an
habe jetzt einfach mal den Ardunio nach 20sek ausgeschaltet und siehe da, label1 wird noch 3 Sekunden mit neuen Daten gefüttert, also Anzeige akutalisiert. Beim Terminalprogramm ist sofort nach dem Ausschalten vom Ardunio Schluss. So wie es sein soll.....es muß also was mit Lazarus bzw Synaser zu tun haben, daß dieser Versatz da ist.
Packe ich in die Timerroutine noch mehr Befehle, aus dem String Teilstring auslesen und in anderen Labeln darstellen, steigt sogar die Verzögerung während der Laufzeit an...als ob ich mit einem 286er und DR-Dos 3.1 arbeite...
Habe die sleep weggelassen, jetzt kommt es aber ab und an zu Problemen mit der Schnittstelle, sie "empfängt" irgendwie falsche Daten und das Programm meckert dann beim Start
es liegt eindeutig an
Code: Alles auswählen
txt:= ser.RecvTerminated(20,chr(254)+chr(163));
habe jetzt einfach mal den Ardunio nach 20sek ausgeschaltet und siehe da, label1 wird noch 3 Sekunden mit neuen Daten gefüttert, also Anzeige akutalisiert. Beim Terminalprogramm ist sofort nach dem Ausschalten vom Ardunio Schluss. So wie es sein soll.....es muß also was mit Lazarus bzw Synaser zu tun haben, daß dieser Versatz da ist.
Packe ich in die Timerroutine noch mehr Befehle, aus dem String Teilstring auslesen und in anderen Labeln darstellen, steigt sogar die Verzögerung während der Laufzeit an...als ob ich mit einem 286er und DR-Dos 3.1 arbeite...
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig
Das kein Programm. Das Codeschnipsel.
Du empfängst schon alle Daten. Aber Dein Empfang hat zwei Abbruchbedingungen: Das Timeout von 20msec und die Endezeichen 254+163. Und das machst Du alle 100msec.
Es kommen 50 bis 200 Zeichen. Bei 19kBaud braucht ein Datensatz damit zwischen 26msec und 104msec. Damit stehen die Chancen recht gut, dass Du nur den ersten Teil des Datensatzes liest, bis das Timeout zuschlägt. Dann wird der Schnipsel in das Memo geschrieben. Sofort kommt aber der zweite Teil, der 100msec später abgefragt wird. Der überschreibt den ersten Teil im Memo, denn Du so schnell gar nicht lesen kannst. => Du siehst nur einen Teil des Datensatzes.
Sendet der Arduino schnell genug einen neuen Datensatz, liest Du nur bis zu den Endezeichen. Der Rest bleibt im Buffer und wird erst 100msec später ausgelesen. Hat der Arduino inzwischen wieder Daten geschickt, liest Du wieder nur bis zum Endezeichen - dem ersten Endezeichen im Buffer. Der Rest bleibt drin, inklusive weiterer Endezeichen. Bei genügend großem Buffer kann sich das aufsummieren.
Wären für mich jetzt zwei Ansätze.
Es kann natürlich auch sein, dass das Kabel so lang ist, dass die Signale unklar ankommen und die Endezeichen nur manchmal erkannt werden.
Du empfängst schon alle Daten. Aber Dein Empfang hat zwei Abbruchbedingungen: Das Timeout von 20msec und die Endezeichen 254+163. Und das machst Du alle 100msec.
Es kommen 50 bis 200 Zeichen. Bei 19kBaud braucht ein Datensatz damit zwischen 26msec und 104msec. Damit stehen die Chancen recht gut, dass Du nur den ersten Teil des Datensatzes liest, bis das Timeout zuschlägt. Dann wird der Schnipsel in das Memo geschrieben. Sofort kommt aber der zweite Teil, der 100msec später abgefragt wird. Der überschreibt den ersten Teil im Memo, denn Du so schnell gar nicht lesen kannst. => Du siehst nur einen Teil des Datensatzes.
Sendet der Arduino schnell genug einen neuen Datensatz, liest Du nur bis zu den Endezeichen. Der Rest bleibt im Buffer und wird erst 100msec später ausgelesen. Hat der Arduino inzwischen wieder Daten geschickt, liest Du wieder nur bis zum Endezeichen - dem ersten Endezeichen im Buffer. Der Rest bleibt drin, inklusive weiterer Endezeichen. Bei genügend großem Buffer kann sich das aufsummieren.
Wären für mich jetzt zwei Ansätze.
Es kann natürlich auch sein, dass das Kabel so lang ist, dass die Signale unklar ankommen und die Endezeichen nur manchmal erkannt werden.
-
- Beiträge: 6917
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig
Das habe ich auch übersehen, der TE schreibt in ein Label.Der überschreibt den ersten Teil im Memo, denn Du so schnell gar nicht lesen kannst. => Du siehst nur einen Teil des Datensatzes.
Bessere wäre zur Kontrolle:
Code: Alles auswählen
Memo1.Text := Memo1.Text + neueDaten;
Code: Alles auswählen
Writeln(neueDaten);
Aus diesem Grund ist dort die while-Schleife.
Code: Alles auswählen
while Timer1.Enabled and (ser.CanRead(10)) do begin
l := ser.WaitingData;
SetLength(s, l);
ser.RecvBuffer(@s[1], l);
Memo1.Text := Memo1.Text + s;
if CheckBox1.Checked then begin
Memo1.SelStart := -2;
end;
Application.ProcessMessages;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot