Einzelnen Beitrag anzeigen

SearchBot

Registriert seit: 27. Jun 2004
Ort: N-W vom Bodensee
272 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

TComport - Access Violation beim wieder-öffnen

  Alt 16. Nov 2016, 14:06
Hallo

ich verwende die TComport-Komponente 4.11

Ich habe das Problem, daß es spätestens bei Programmende zu dieser Meldung kommt und abschließend mit dem Fensterchen "Runtime Error 216":
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ***.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x0040a3bc: read of address 0x00000058' aufgetreten.
---------------------------

"Anhalten" bringt mich in ein für mich nichts sagendes CPU-Fenster, der Stack-Verlauf führt mich nicht in den Quelltext.

Dieses Verhalten habe ich immer dann, wenn ich Daten gelesen habe (RxBuf, siehe unten), den Comport schließe und danach wieder öffne - oder spätestens eben bei Programmende.

Es scheint auch keine Exception zu sein, die in der Komponente abgefangen werden kann (onException wird nicht angesprungen).

Vielleicht habe ich auch was in meinem Object (hier ein Auszug) falsch gemacht?!

Delphi-Quellcode:
  type TData = object
    Bytes: array[1..50] of byte;
    Len:byte;
    procedure Clear;
  end;


type ... // in einem Object
  private
   fReceived:AnsiString;
   procedure CleanReceived(const Value:Ansistring);
  public

   Data:TData;
   property received:AnsiString read fReceived write CleanReceived;
end;

procedure TData.Clear;
var I: Integer;
begin
  for I := 1 to 50 do begin
   Bytes[i]:=0;
   len:=0;
  end;
end;

procedure .. .CleanReceived(const Value:AnsiString);
begin
  setlength(fReceived,Length(Value));
  fReceived:=Value;
end;

procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
var
  I: Integer; Buf:Array[1..100] of AnsiChar; s:AnsiString; P:PansiChar;
begin
  setLength(s,count);

  p:=pAnsichar(@Buffer);
  for I := 1 to Count do begin
    if i<=100 then begin
     Buf[i]:=p^;
     Data.Bytes[i]:=ord(Buf[i]);
    end;
    inc(p);
  end;
  if count<=100 then
  s:=copy(Buf,1,count)
  else
  s:=copy(Buf,1,100);

  received:=s; //pur wie es kommt ins property

  s:=AsciiToHex(S); //verschönern als lesefreundliche Hex-Ausgabe; aus JvCsvParse

  for I := 1 to length(s)*2 do
   if I mod 3=0 then insert(#32,s,i);

  if count>100 then s:=s+'...';

  lb_Answer.Caption:=s;
end;
Theoretisch könnte dieser Quelltext ursächlich sein, ich meine, es habe mal in TData.Clear geknallt, aber ich sehe darin keinen Fehler!?

Wo stimmt da was nicht?
Danke im Voraus fürs mitdenken.

Geändert von SearchBot (16. Nov 2016 um 14:09 Uhr)
  Mit Zitat antworten Zitat