Einzelnen Beitrag anzeigen

Schulze

Registriert seit: 2. Nov 2011
4 Beiträge
 
#1

TComPort: Zugriffsverletzung beim Senden eines Strings

  Alt 2. Nov 2011, 19:21
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:
delphierror.jpg

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.

Geändert von Schulze ( 2. Nov 2011 um 22:04 Uhr)
  Mit Zitat antworten Zitat