Synapse Com-Auslesen: Daten werden zeitversetzt angezeigt

Für Fragen von Einsteigern und Programmieranfängern...
Mathias
Beiträge: 6162
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

Beitrag von Mathias »

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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Timm Thaler
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

Beitrag von Timm Thaler »

lazarus_fan hat geschrieben:Also, neue Erkenntnis: die Verzögerung steigt mit der Laufzeit des Programmes.


Und, wie sieht denn das Programm aktuell aus? Raten kann man viel...

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.

lazarus_fan
Beiträge: 15
Registriert: Mi 28. Dez 2016, 21:13

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

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

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...

Timm Thaler
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

Beitrag von Timm Thaler »

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.

Mathias
Beiträge: 6162
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

Beitrag von Mathias »

Der überschreibt den ersten Teil im Memo, denn Du so schnell gar nicht lesen kannst. => Du siehst nur einen Teil des Datensatzes.

Das habe ich auch übersehen, der TE schreibt in ein Label.
Bessere wäre zur Kontrolle:

Code: Alles auswählen

Memo1.Text := Memo1.Text + neueDaten;

oder ein einfaches

Code: Alles auswählen

Writeln(neueDaten);


Was auch noch wichtig ist, im Timer auch alles auszulesen und nicht nur ein Datenpaket.
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;     

Aber wie schon weiter oben gesagt, würde ich dies sowieso Bidirektional lösen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten