Synapse Com-Auslesen: Daten werden zeitversetzt angezeigt

Für Fragen von Einsteigern und Programmieranfängern...
lazarus_fan
Beiträge: 15
Registriert: Mi 28. Dez 2016, 21:13

Synapse Com-Auslesen: Daten werden zeitversetzt angezeigt

Beitrag von lazarus_fan »

Hallo Leute,
mit dem Synapse-Modul lese ich die USB-Schnittstelle aus und will die empfangenen Daten anzeigen. An der Usb-Schnittstelle hängt ein Arduiono und sendet Daten. Das Auslesen klappt soweit, nur das Anzeigen nicht so ganz. Die Daten werden extrem zeitversetzt angezeigt, ca 5-7Sekunden. Mit einem Terminal-Programm gecheckt kann ich den Arduino etc ausschließen, da fließt alles perfekt. Es muss also an meiner Programmierung liegen :(


bei Form.Create steht:

Code: Alles auswählen

ser := TBlockSerial.Create;
  ser.Purge;
 
  {$IFDEF MSWINDOWS}
  ser.Connect('COM3');
  {$ELSE}
  ser.Connect('/dev/ttyUSB0');
  {$ENDIF}
 
  Sleep(2000);
  ser.Config(19200, 8, 'N', SB1, False, False);
  Sleep(2000);
  Timer1.Interval:=100;
  Timer1.Enabled := True;
  Memo1.Lines.Add('Device: ' + ser.Device + '   Status: ' + ser.LastErrorDesc + ' ' + IntToStr(ser.LastError));
  Sleep(1000);


dann habe ich einen Timer mit 100ms eingerichtet

Code: Alles auswählen

txt:= ser.RecvTerminated(20,chr(254)+chr(163))
label1.caption:=txt;


chr(254)+chr(163) sind die beiden Zeichen, die das Datenende/Paketende darstellen. Es werden pro Paket zwischen 50-200 Zeichen übertragen.

Wie schon gesagt, Label1 hat erst ca. 5-7 Sek die richtigen Daten. Ebenfalls ein Memo zum Gegentesten. Bin verwirrt und ratlos - Wer hat da einen Tip für mich Anfänger? Vielen Dank.

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von compmgmt »

Code: Alles auswählen

...
Sleep(2000);
...
Sleep(2000);
...
Sleep(1000);
...
Kein Wunder, da du insgesamt fünf Sekunden im FormCreate wartest. Das Fenster wird erst angezeigt, nachdem FormCreate und FormShow durchgelaufen wurde ;)

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

Mh....aber ist das nicht nur einmal, beim Programm-Start? Weil der Rest läuft doch über den Timer, also Auslesen und Anzeigen..oder werden die neuen Daten da hinten angehangen und es kommt automatisch auf Dauer zu einem Versatz ? Die Wait-Anweisungen haben ich hier aus dem Forum. Weil sonst irgendwas nicht richtig initialisiert wird oder so...

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von compmgmt »

Wenn es öfters passiert und du Windows nutzen solltest, ist während dieser fünf sekunden das Fenster eingefroren? Wenn ja, arbeitet es während dieser fünf sekunden scheinbar extrem viel im Hintergrund.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von af0815 »

Hast du in der Timerschleife Application.ProcessMessages; drinnen ? Weil ohne das wird das UI nicht upgedated.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

Ob das Fenster am Anfang eingefroren ist, kann ich nicht sagen. Teste ich heute Abend.

nein, ich verwende in der Timer-Schleife nur die zwei Anweisungen Datenpaket auslesen und im Label anzeigen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von af0815 »

lazarus_fan hat geschrieben:nein, ich verwende in der Timer-Schleife nur die zwei Anweisungen Datenpaket auslesen und im Label anzeigen

Dann füge mal das Application.ProcessMessages; hinzu, ansonsten hat das Fenster wenig Möglichkeit bearbeitet zu werden und das Label wird nicht aktualisiert, zumindest nicht sichtbar für dich.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

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

Die Daten werden extrem zeitversetzt angezeigt, ca 5-7Sekunden. Mit einem Terminal-Programm gecheckt kann ich den Arduino etc ausschließen, da fließt alles perfekt. Es muss also an meiner Programmierung liegen

Vielleicht hilft dir das Programm im Anhang weiter. Es ähnelt, ein bisschen des Serial-Monitor von Arduino.
Es ist noch nicht fertig, aber es könnte dein Problem lösen.

Die Zeitversetzung könnte noch ein anderer Grund haben. Wen zB. ein Ardunino in einer Endlosschleife Daten an den Com-Port schickt, ist es gut möglich das sich alte Daten im UART-Puffer befinden und diese sieht man natürlich zuerst im Terminal.Programm. Aber auch dafür würde es ein Lösung geben, vorausgesetzt man passt noch den Sketch im Arduino an.
Dateianhänge
Serial Monitor.zip
(128.28 KiB) 66-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

also ich habe alle wait-Anweisungen entfernt und auch Application.ProcessMessages hinzugefügt und konnte die Verzögerung auf 2 Sekunden drücken...auch ist mir aufgefallen, daß nur jeder zweite Datensatz angezeigt wird. Es wird mit 19,2kb übertragen und mein Prozessor hat hier 1,83GHZ. Das sollte doch machbar sein, oder?

Vielen Dank für das Program, leider kann ich damit nichts anfangen, weil er gleich meckert die Package Lazserialport ist nicht da. Und ich finde einfach keinen Download davon :(

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

leider kann ich damit nichts anfangen, weil er gleich meckert die Package Lazserialport ist nicht da. Und ich finde einfach keinen Download davon

Die kannst du entfernen und durch und durch die Synapse ersetzen, weil nur die synaser.pas davon gebracht wird, welche bei Synapse auch vorhanden ist.

Ansonsten gibt es die TLazserial hier. https://github.com/me2d13/luamacros/blo ... zSerial.7z
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

Danke für die Hilfe :)

Ganz vergessen: der Arduino schickt in Endlos-Schleife, das stimmt, aber warum kann der PC das nicht auswerten? Da muß es doch eine Möglichkeit geben, daß die Daten in Real-Time angezeigt werden kann....

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

und dennoch geht es nicht :( BaseUnix wird nicht gefunden und nach der Löschung im Unit-Kopf meckert er bei "st: stat; "

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

Ganz vergessen: der Arduino schickt in Endlos-Schleife, das stimmt, aber warum kann der PC das nicht auswerten? Da muß es doch eine Möglichkeit geben, daß die Daten in Real-Time angezeigt werden kann....

Ich mache auch Real-Time-Messungen mit meinem Arduino. Nur bestimmt bei mit der PC das Tempo. Ich schicke mit dem PC ein Zeichen an den Arduino, und anschliessend gibt der Arduino den Messwert als Antwort.
Das sieht dann etwa so aus:

Code: Alles auswählen

var
  buf: packed array [0..3] of byte;
...
  ser.SendByte(1); // Ein Zeichen senden
  ser.RecvBufferEx(@serbuf, 4, 1000); // Die Antwort des Arduinos auslesen
 
  WriteLn(serbuf.Mess);   


Code: Alles auswählen

void loop(void) {
  char c[1];
 
  while (Serial.available() > 0) {  // Will der PC was ?
    Serial.readBytes(c, 1); Zeichen einlesen
 
    switch (c[0]) {
      case 1:  // Einzel
        adc[0].Data[0] = readADC(serialIn.Config[0], i2cAdrSonde); // Messwerte einlesen.
        adc[0].Data[1] = readADC(serialIn.Config[1], i2cAdrPoti);
        Serial.write(adc[0].buf, 4); Messwerte ausgeben.
        break;
      case 2:
        // mache was anderes
        break;
    }
  }
}
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

lazarus_fan hat geschrieben:und dennoch geht es nicht :( BaseUnix wird nicht gefunden und nach der Löschung im Unit-Kopf meckert er bei "st: stat; "

So wie ich sehe verwendest du Windows.
Lösche BaseUnix und die ganze Funktion GetSerialPortsName. Auch die Zeile bei der GetSerialPortsName aufgerufen wird kannst entfernen.

PS: Was für ein Arduino verwendest du ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: Synapse Com-Auslesen: Daten werden zeitversetzt angezeig

Beitrag von lazarus_fan »

Also, neue Erkenntnis: die Verzögerung steigt mit der Laufzeit des Programmes. Am Start habe ich Echtzeit-Anzeige...nach 2 Minuten sind es schon 12Sekunden Verzögerung :(
und es wird immer länger :(

Und es wird auch perfekt jeder zweite Datensatz eingelesen, also einer wird immer ausgelassen ...ich kriege die Krise :(

Antworten