Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit WriteFile für die COM-Schnittstelle (https://www.delphipraxis.net/70499-problem-mit-writefile-fuer-die-com-schnittstelle.html)

gsh 31. Mai 2006 08:01


Problem mit WriteFile für die COM-Schnittstelle
 
Hi DPler

Ich hab ein Problem mit WriteFile für die COM-Schnittstelle
Ich verwende für die COM Schnittstelle die Unit UCOM (nicht die Komponente)

Jetzt hab ich mir eine Prozedur geschrieben die vier Byte nacheinander sendet und beim vierten Byte gibt es einen access fehler (schreiben auf adresse: zugriff verweigert)

Delphi-Quellcode:
procedure TCOMThread.SendData(Speicherpos : integer; Data : Char);
const
  cSleepTime = 10;
var
  DPTR, DPH, DPL : String;
  Command : String;
  TempChar : PChar;
begin
  DPTR := IntToBin(Speicherpos, 16);
  DPH := copy(DPTR, 1, 8);
  DPL := copy(DPTR, 9, 8);
  COMPort.SendString(#64);
  sleep(cSleepTime);
  COMPort.SendString(PChar(IntToStr(BinToInt(DPH))));
  sleep(cSleepTime);
  COMPort.SendString(PChar(IntToStr(BinToInt(DPL))));
  sleep(cSleepTime);
  TempChar := PChar(Data);
  COMPort.SendString(TempChar);  //<--- Hier kommt die Fehlermeldung
end;
Die Unit:
Delphi-Quellcode:
procedure TCOM.SendString(const Buffer: PChar);
var BytesWritten: DWord;
begin
  WriteFile(PortHandle, Buffer^ ,Length(Buffer) ,BytesWritten ,NIL);
  Inc(COMThread.ComSendedBytes);
end;
Der Aufruf der Prozedure:
Delphi-Quellcode:
SendData(AktSpeicherPos, DataField[Y, X]);
Konnt ihr mir helfen?

marabu 31. Mai 2006 08:11

Re: Problem mit WriteFile für die COM-Schnittstelle
 
Hallo Alex,

die Prozedur SendString() erwartet eine implizite Längenangabe für den Buffer. Diese ist nur gegeben, wenn du PChar(String) übergibst, nicht bei PChar(Char). Also versuche es so:

Delphi-Quellcode:
procedure TCOMThread.SendData(Speicherpos : integer; Data : Char);
var
  TempChar : String;
begin
  // ...
  TempChar := Data;
  COMPort.SendString(PChar(TempChar));
end;
Grüße vom marabu

Robert Marquardt 31. Mai 2006 08:17

Re: Problem mit WriteFile für die COM-Schnittstelle
 
Du erzeugst mit PChar(Data) einen Zeiger auf den Char Data. SendString sendet aber einen nullterminierten C-String.
Die Terminierung des Strings, sprich das 0-Byte das auf Data folgen sollte, fehlt hier aber.
Delphi-Quellcode:
var
  DSTR: array [0..1] of Char;
begin
  DSTR[0] := Data;
  DSTR[1] := #0;
  COMPort.SendString(@DSTR[0]);
end;
marabu's Losung ist meiner aequivalent, nur das ich es zu Fuss mache waehrend die Zuweisung eines Chars an einen string von Delphi intern gehandhabt wird.

gsh 31. Mai 2006 10:11

Re: Problem mit WriteFile für die COM-Schnittstelle
 
ahh
sowas hab ich mir gedacht (deshalb der versuch mit TempChar) ich hab nur keine Lösung gefunden

So müsste es doch auch gehen oder?
Delphi-Quellcode:
procedure TCOMThread.SendData(Speicherpos : integer; Data : String);
begin
//[..]
  COMPort.SendString(PChar(Data));
end;
oder MUSS ich über TempChar gehen?

Das problem ist das ich des zur Zeit nicht testen kann ... der Prozzesor ma zur zeit nicht gern aber des ist ein anderes Problem

marabu 31. Mai 2006 10:18

Re: Problem mit WriteFile für die COM-Schnittstelle
 
So geht das.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz