![]() |
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:
Die Unit:
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;
Delphi-Quellcode:
Der Aufruf der Prozedure:
procedure TCOM.SendString(const Buffer: PChar);
var BytesWritten: DWord; begin WriteFile(PortHandle, Buffer^ ,Length(Buffer) ,BytesWritten ,NIL); Inc(COMThread.ComSendedBytes); end;
Delphi-Quellcode:
Konnt ihr mir helfen?
SendData(AktSpeicherPos, DataField[Y, X]);
|
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:
Grüße vom marabu
procedure TCOMThread.SendData(Speicherpos : integer; Data : Char);
var TempChar : String; begin // ... TempChar := Data; COMPort.SendString(PChar(TempChar)); end; |
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:
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.
var
DSTR: array [0..1] of Char; begin DSTR[0] := Data; DSTR[1] := #0; COMPort.SendString(@DSTR[0]); end; |
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:
oder MUSS ich über TempChar gehen?
procedure TCOMThread.SendData(Speicherpos : integer; Data : String);
begin //[..] COMPort.SendString(PChar(Data)); end; Das problem ist das ich des zur Zeit nicht testen kann ... der Prozzesor ma zur zeit nicht gern aber des ist ein anderes Problem |
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