Probleme mit Synapse - USB Serial

Rund um die LCL und andere Komponenten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

// Simuliert ein stotternder PC
Warum ist das wichtig?

Weil ich eine Echtzeit-Messung machen will, ca. 1000Messungen/sek.
Aus diesem Grund will ich die Messdaten im Arduino puffern.

Am Anhang sieht man den Unterschied, unten ungepuffert, oben gepuffert.
Das die Linie oben nicht gerade ist, liegt daran, das ich das Poti von Hand nicht linear genug führte.
Ich habe in beiden Varianten ein sleep(random(100)); eingebaut.
Im ersten Bild sieht man, bei "i', wie viel Messung auf einmal eingelesen werden.

Application.ProcessMessages;
das kann ich glaube ich nicht machen, bei einer Konsolen Anwendung.

Aber dafür hast du dort ReadKey und KeyPressed.

s
Dateianhänge
Bildschirmfoto vom 2017-01-30 20-35-42.png
Bildschirmfoto vom 2017-01-30 20-35-42.png (9.53 KiB) 1675 mal betrachtet
Bildschirmfoto vom 2017-01-30 20-31-42.png
Bildschirmfoto vom 2017-01-30 20-27-46.png
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Aber dafür hast du dort ReadKey und KeyPressed.

Die nutze ich jedoch im Normalfall nicht, da die Anwendungen im Hintergrund laufen.
Nur zum Debugger nutze ich es.
Im Normalfall läuft hier eine endlos schleife...
MFG
Michael Springwald

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Im Normalfall läuft hier eine endlos schleife...

Dann ist deine einzige Möglichkeit das Programm zu beenden ein Klick auf (X) ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Dann ist deine einzige Möglichkeit das Programm zu beenden ein Klick auf (X) ?

nein per kill pid.

Das ganze läuft auf dem Banana PI im Hintergrund.

So starte ich alle Anwendungen z.b.

Code: Alles auswählen

 
#!/bin/sh
 
if [ $1 = "start" ] ; then
/home/pluto/myApps/Pluto_Daten_Verteiler/bin/pdvAPP host 10.10.10.13 port 8080 nokeypress >/dev/null &
echo $! > /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pdvAPP_pid
sleep 4
 
/home/pluto/myApps/Pluto_Daten_Verteiler/bin/pwiAPP host 10.10.10.13 port 8080 web_port 8084 nokeypress >/dev/null &
echo $! > /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pwiAPP_pid
sleep 4
 
/home/pluto/myApps/Pluto_Daten_Verteiler/bin/pacAPP appid 01 host 10.10.10.13 port 8080 nokeypress >/dev/null &
echo $! > /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pacAPP_pid
sleep 4
 
/home/pluto/myApps/Pluto_Daten_Verteiler/bin/pmpdAPP host 10.10.10.13 port 8080 nokeypress >/dev/null &
echo $! > /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pmpd_pid
sleep 4
 
/home/pluto/myApps/Pluto_Daten_Verteiler/bin/pasAPP host 10.10.10.13 port 8080 nokeypress >/dev/null &
echo $! > /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pasAPP_pid
sleep 4
 
/home/pluto/myApps/PBI/pbiAPP >/dev/null &
echo $! > /home/pluto/myApps/PBI/pbiAPP.pid
sleep 2
 
exit 0
fi
 
if [ $1 = "stop" ] ; then
kill $( cat /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pwiAPP_pid)
kill $( cat /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pacAPP_pid)
kill $( cat /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pmpd_pid)
kill $( cat /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pasAPP_pid)
kill $( cat /home/pluto/myApps/Pluto_Daten_Verteiler/bin/run/pdvAPP_pid)
kill $( cat /home/pluto/myApps/PBI/pbiAPP.pid)
exit 0
fi
 
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Heute war es mal wieder so weit mit dem Beschrieben Fehler.

Ich habe in dmesg folgenden Hinweis gefunden:
[4470663.713292] lowmemorykiller: Killing 'pacAPP' (32407), adj 0,

Ich deute es so, dass es zu wenig "Speicher" gab und darum meine Anwendung beenden wurde.
MFG
Michael Springwald

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Wer liefert dir diese Fehlermeldung ?
Kommt die von der Linux-Bash ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

dmsg.

Ich habe heute mal die SD Karte ausgetauscht gegen eine doppelt so große. Außerdem habe ich eine Core Datei gefunden im Verzeichnis wo die bin Dateien liegen.
Ich glaube es liegt an der SD Karte, da waren nur noch wenige GB frei. Aber in ca 10 bis 15 Tagen wissen wir es genau.

USB ist eigentlich nicht für den Dauereinsatz gemacht. Vielleicht werde ich auf I²C wechseln.
MFG
Michael Springwald

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Ich glaube es liegt an der SD Karte, da waren nur noch wenige GB frei. Aber in ca 10 bis 15 Tagen wissen wir es genau.

Wäre komisch, wen deine SD-Karte erst in 10 Tagen voll ist.

Es wird etwas über " lowmemorykiller:" geschrieben, könnte es auch sein, das es dein RAM wegen eines Speicher-Leaks füllt ?

USB ist eigentlich nicht für den Dauereinsatz gemacht. Vielleicht werde ich auf I²C wechseln.

Wieso sollte USB nicht für einen Dauereinsatz geeignet sein ?
Aber i²C ist sicher nicht falsch, da der Raspi dies Onboard hat.

Wieso machst du eigentlich die Umwege über einen Arduino, sind die GPIOs des Raspi für dein Projekt nicht geeignet ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Wäre komisch, wen deine SD-Karte erst in 10 Tagen voll ist.

Naja... Z.B. hatte ich einmal beobachtet das ALLE Dateirechte von meinen Log Dateien weg waren. Weiß nicht wie lange schon.

Es wird etwas über " lowmemorykiller:" geschrieben, könnte es auch sein, das es dein RAM wegen eines Speicher-Leaks füllt ?

Stimmt. Wäre auch möglich.

Wieso sollte USB nicht für einen Dauereinsatz geeignet sein ?

Weiß nicht so genau... muss ich mal nachfragen.

Aber i²C ist sicher nicht falsch, da der Raspi dies Onboard hat.

Der Banana PI auch. Jedoch muss ich hier ein Spannungsregler einsetzten, da die Pins nur 3,3 Volt tolerant sind.

Wieso machst du eigentlich die Umwege über einen Arduino, sind die GPIOs des Raspi für dein Projekt nicht geeignet ?

Wenn ich beim PI was kaputt mache, kostet mich das über 30€. Wenn ich ein Arduino Kaputt mache kostet mich das 1,81€. Außerdem ist der PI nur 3,3 Volt Tolerant.
Das stellt mich immer wieder vor Problemen.
MFG
Michael Springwald

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Es wird etwas über " lowmemorykiller:" geschrieben, könnte es auch sein, das es dein RAM wegen eines Speicher-Leaks füllt ?

Stimmt. Wäre auch möglich.

Dies ist bei deinem Code gut möglich, du hast sehr viele Create und Assigned in dem Code für den Com-Port.
Ein Free vergessen, und der Speicher füllt sich langsam.


Der Banana PI auch. Jedoch muss ich hier ein Spannungsregler einsetzten, da die Pins nur 3,3 Volt tolerant sind.

Mit dieser kleine Schaltung ist das Problem gelöst.

http://playground.arduino.cc/Main/I2CBi ... velShifter

Wenn ich beim PI was kaputt mache, kostet mich das über 30€. Wenn ich ein Arduino Kaputt mache kostet mich das 1,81€. Außerdem ist der PI nur 3,3 Volt Tolerant.
Das stellt mich immer wieder vor Problemen.

Das ist natürlich ein Argument.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Dies ist bei deinem Code gut möglich, du hast sehr viele Create und Assigned in dem Code für den Com-Port.
Ein Free vergessen, und der Speicher füllt sich langsam.

Du weißt schon das Assigned nur prüft ob, die Klasse erstellt wurde oder nicht? Bevor ich auf eine Variable die eine Klasse ist zugreife habe ich mir angewöhnt immer zu prüfen ob die auch da ist.

Mit dieser kleine Schaltung ist das Problem gelöst.

Wieder eine Extra Komponente. Sowas habe ich sogar schon, aber noch nie ausprobiert.....

Mir ist noch was aufgefallen in den Log.... was ein Eventuellen Speicherüberlauf klären könnte.

[code=laz]
procedure TPAC.onSensorData(ArduinoSensor: TPLArduinoSensor);
var
i,temp:Integer;
str,str2,StrValue:string;
begin
try
for i:=0 to ArduinoSensor.Parameters.Count-1 do begin
str2:='';
if ArduinoSensor.Parameters[i].Value = 'E' then Continue;
StrValue:=ArduinoSensor.Parameters[i].Value + ' ' + ArduinoSensor.Parameters[i].Unity;
if (Assigned(ArduinoSensor.Location)) then begin

if (ArduinoSensor.Parameters.Count-1 = ArduinoSensor.Location.Count-1) and (ArduinoSensor.Location[i].Value <> '') then
str2:=ArduinoSensor.Location[i].Value+'/'
else begin
Temp:=strToInt(Trim(StrValue))-1;
if Temp > -1 then begin
StrValue:=ArduinoSensor.Location[Temp].Value;
end;
end;
end;
str:='/'+ArduinoSensor.Pfad + ArduinoSensor.Name+'/' +str2+ArduinoSensor.Parameters[i].Title +'/' +
ArduinoSensor.ID+IntToStr(i)+'/';

Temp:=InfoList.FindItem(str);
str:=str+StrValue;
if (Temp = -1) or ((Temp > -1) and (InfoList[Temp].Value <> StrValue)) then begin
PLClient.SendAMessage(str+#10);
sleep(30);
end;
end; // for i
except
PLArduino.LogFile.WriteInLogFile('TPAC.onSensorData');
end;
end; // TPAC.onSensorData
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Dies ist bei deinem Code gut möglich, du hast sehr viele Create und Assigned in dem Code für den Com-Port.
Ein Free vergessen, und der Speicher füllt sich langsam.

Du weißt schon das Assigned nur prüft ob, die Klasse erstellt wurde oder nicht? Bevor ich auf eine Variable die eine Klasse ist zugreife habe ich mir angewöhnt immer zu prüfen ob die auch da ist.

Mit dieser kleine Schaltung ist das Problem gelöst.

Wieder eine Extra Komponente. Sowas habe ich sogar schon, aber noch nie ausprobiert.....

Mir ist noch was aufgefallen in den Log.... was ein Eventuellen Speicherüberlauf klären könnte.

Code: Alles auswählen

 
procedure TPAC.onSensorData(ArduinoSensor: TPLArduinoSensor);
var
  i,temp:Integer;
  str,str2,StrValue:string;
begin
  try
    for i:=0 to ArduinoSensor.Parameters.Count-1 do begin
      str2:='';
      if ArduinoSensor.Parameters[i].Value = 'E' then Continue;
      StrValue:=ArduinoSensor.Parameters[i].Value + ' ' + ArduinoSensor.Parameters[i].Unity;
      if (Assigned(ArduinoSensor.Location)) then begin
 
        if (ArduinoSensor.Parameters.Count-1 = ArduinoSensor.Location.Count-1) and (ArduinoSensor.Location[i].Value <> '') then
          str2:=ArduinoSensor.Location[i].Value+'/'
        else begin
          Temp:=strToInt(Trim(StrValue))-1;
          if Temp > -1 then begin
            StrValue:=ArduinoSensor.Location[Temp].Value;
          end;
        end;
      end;
      str:='/'+ArduinoSensor.Pfad + ArduinoSensor.Name+'/' +str2+ArduinoSensor.Parameters[i].Title +'/' +
               ArduinoSensor.ID+IntToStr(i)+'/';
 
      Temp:=InfoList.FindItem(str);
      str:=str+StrValue;
      if (Temp = -1) or ((Temp > -1) and (InfoList[Temp].Value <> StrValue)) then begin
        PLClient.SendAMessage(str+#10);
        sleep(30);
      end;
    end; // for i
  except
    PLArduino.LogFile.WriteInLogFile('TPAC.onSensorData');
  end;
end; // TPAC.onSensorData
 


Auf diese Weise Sende ich "Infos" an den Server. Beachte das sleep von 30 ms. Wenn ich die kürze, kommt es nicht als einzelne Nachrichten an, sondern als eine Zusammenhängende.
Beim Banana PI Client ist mir aufgefallen, dass der sleep halt nur 10 ms lang war. In den Logs konnte ich sehen das diese Zusammenhängede Infos scheinbar nur vom Banana PI Client stammt.

Es gibt drei Clients, die eine Info Liste speichern. Das ist eine Liste, wo jede Info "NUR" einmal vorkommen soll. Damit der Client die Empfangen Daten speichern kann. Wenn aber die infos nicht einzeln kommen, könnte das zu Fehlern führen die ein Speicher "Überlauf" bedeuten könnten.

Mal sehen wie lange das ganze jetzt läuft mit der Anpassung.
MFG
Michael Springwald

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Probleme mit Synapse - USB Serial

Beitrag von mschnell »

pluto hat geschrieben:Wenn ich die kürze, kommt es nicht als einzelne Nachrichten an, sondern als eine Zusammenhängende.

Die Gefahr ist groß, dass es unter manchen Umständen trotz sleep als einzelne Nachricht ankommt.

Besser wäre, die Nachrichten durch das Format der Nachricht zu trennen (ein Standard-Verfahren ist z.B. Nachricht in ASCII-Zeichen, jede Nachricht beginnt mit STX und endet mit ETX). Dann können auch gekoppelte Nachrichten vom Empfänger richtig verarbeitet werden.

-Michael

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Probleme mit Synapse - USB Serial

Beitrag von pluto »

Die Gefahr ist groß, dass es unter manchen Umständen trotz sleep als einzelne Nachricht ankommt.

Stimmt.

Besser wäre, die Nachrichten durch das Format der Nachricht zu trennen (ein Standard-Verfahren ist z.B. Nachricht in ASCII-Zeichen, jede Nachricht beginnt mit STX und endet mit ETX). Dann können auch gekoppelte Nachrichten vom Empfänger richtig verarbeitet werden.

Das hatte ich am Anfang. Ich dachte halt so wäre es besser. Vielleicht ändere ich das noch mal.

Danke für den Hinweis. Ich hatte irgendein Trennzeichen.
MFG
Michael Springwald

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Probleme mit Synapse - USB Serial

Beitrag von Mathias »

Besser wäre, die Nachrichten durch das Format der Nachricht zu trennen (ein Standard-Verfahren ist z.B. Nachricht in ASCII-Zeichen, jede Nachricht beginnt mit STX und endet mit ETX). Dann können auch gekoppelte Nachrichten vom Empfänger richtig verarbeitet werden.

Dies ist sicher ein gute Sache, dies funktioniert aber nur, wen man Text-Dateien überträgt.
Will man aber einen AVR alles an Geschwindigkeit rausholen, muss man einer Binären Übertragen den Vorrang geben. Ein IntToStr brauch sehr viel kostbare Leistung in einem AVR.

Ich sage lieber dem AVR, jetzt bin ich bereit, jetzt kannst senden. Das Senden kann man ähnlich eines TStream für eine Array machen, Zuerst die Länge senden, anschliessend die Daten.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten