Hallo!
Ich nutze schon länger dieses Forum als Datenbank für Tipps und Codeschnipsel und es hat mir schon oftmals geholfen. Doch nun bin ich einmal mehr mit meinem Latein am Ende und finde keine Lösung dazu. Jetzt hoffe ich auf eure Hilfe.
Es geht um ein kleines Programm, welches einen digitalen Druckkalibrator (quasi eine Luftpumpe mit hochgenauem Drucksensor) fernsteuert. Es sind nicht viele Funktionen dazu notwendig. Es werden lediglich Befehle für "Sollwert setzen", "Auf Sollwert pumpen" und "Entlüften" über die Serielle Schnittstelle gesendet. Bis auf "Sollwert setzen" sind die Befehle statisch und für die Kommunikation nutze ich die TComPort von Dejan Crnila, wenn auch nicht die neuste Version, aber sie funktioniert.
Die statischen Befehle lassen sich ohne Probleme senden, lediglich bei dem Befehl zum Setzen des Solldrucks, bei dem der Inhalt eines Textfeldes (String zu Integer, mit 10 multiplizieren und wieder zurück zum String) in den zu sendenden String mit eingebaut werden muss, stürzt das Programm nach dem 2. 0der 3. Senden des Befehles mit einer Zugriffsverletzung ab.
Statischer Befehl:
Delphi-Quellcode:
if ComPort.Connected then begin
Str := ':ps 0 ' + #13;
ComPort.WriteStr(Str);
Status.Panels[0].Text := Str;
end;
Der Befehl zum Senden des Solldruckes:
Delphi-Quellcode:
if ComPort.Connected then begin
TempVal := StrToFloat(EditSW.Value)*10;
TxStr := ':pr ' + FloatToStr(TempVal) + #13;
Status.Panels[0].Text := TxStr; // Debugging-Infos ausgeben
ComPort.WriteStr(TxStr);
EditSW ist ein JvValidateEdit, das einen Double ausgibt. Die komplette Umwandlung und Umrechnung scheint problemlos von Statten zu gehen. Wenn ich ComPort.WriteStr() in diesem Code auskommentiere, so wird der Befehl korrekt in der Statusleiste beliebig oft angezeigt. Nach dem Verbinden mit dem
COM (Sende-Befehl nicht auskommentiert), lässt sich der Befehl beim ersten Mal korrekt senden, wobei bereits in der Statusanzeige, welche noch vor dem Senden geändert wird, nur ":pr" steht, anstatt wie gewöhnlich ":pr 0". Im Terminal (0-Modemkabel zwischen 2 COMs) wird der Befehl korrekt angezeigt. Nach dem 2. Senden (Ebenfalls korrekt im Terminal) erscheint die folgende Fehlermeldung, ohne Ausführen über die
IDE schließt das Programm einfach:
Durch Auskommentieren und Ausprobieren habe ich mittlerweile herausgefunden, dass SendStr vom TComPort ein Problem mit zusammengesetzten Strings hat.
Beispiel:
Delphi-Quellcode:
// Funktioniert:
Str := '
:ps ' + '
0' + #13;
ComPort.WriteStr(Str);
//Funktioniert nicht und stürzt mit einer Access Violation ab:
Str2 := '
0';
Str := '
:ps 0' + Str2 + #13;
ComPort.WriteStr(Str);
Ich nutze Delphi 6 und TComPort 3.0.
Kann jemand den Fehler nachvollziehen oder reproduzieren?
Vielen Dank für eure Hilfe im Vorraus!
Grüße,
Sebastian
Edit: Wenn ich TxString mit Copy() in einen anderen String kopiere, lässt sich eben jener String problemlos senden.