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.