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 Readfile liefert TRUE aber 0 BytesTransferred (https://www.delphipraxis.net/103395-readfile-liefert-true-aber-0-bytestransferred.html)

blackmice 15. Nov 2007 09:29


Readfile liefert TRUE aber 0 BytesTransferred
 
Hallo,

ich denke diese Frage ist sicherlich auch schon 100 mal gestellt worden, aber ich finde die Antwort dazu nicht.

Ich versuche mit

Delphi-Quellcode:
function ReadSeri(Buffer: pchar; rlaenge: DWord): Integer;
var
  BytesTransferred: DWord;
  test : boolean;
begin
  test := ReadFile(Seri, Buffer^, rlaenge, BytesTransferred, nil);
  ReadSeri:=BytesTransferred;
end;
die Serielle Schnittstelle auszulesen. Dummerweise bekomme ich zwar ein TRUE zurück, d.h. er hat die Schnittstelle gefunden, aber er liest nichts aus. Wenn ich das ganze mit einem Terminal gegenprüfe, dann sind da aber Daten drin.

Kann mir jemand helfen??

Danke
Blackmice

marabu 15. Nov 2007 09:48

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Hallo,

ich sehe nur den Aufruf von ReadFile() und ein Result = True mit BytesTransfered = 0 sagt einfach, dass ReadFile() keine Daten abholen konnte. Wenn du sicher bist, dass da welche anstehen, dann würde ich woanders suchen - z.B. bei der Schnittstellensteuerung.

Grüße vom marabu

blackmice 15. Nov 2007 10:05

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Ok, also dann hier mal ein bischen mehr Code. Ich versuche damit Hardware auszulesen. Diese Hardware ist im Entwicklungsstadium, aber ich kann nicht beeinflussen, was ich bekomme. Ich muss nur weiterverarbeiten, was dann kommt.

Delphi-Quellcode:
//==============================================================================
// Diese Funktion schreibt über die Serielle Schnittstelle
//==============================================================================
function WriteSeri(Buffer: pchar; wlaenge: DWord):Integer;
var
  BytesTransferred: DWord;
begin
  WriteFile(Seri, Buffer^, wlaenge, BytesTransferred, nil);
  WriteSeri:=BytesTransferred;
end;

//==============================================================================
// Diese Funktion liest die Serielle Schnittstelle aus
//==============================================================================
function ReadSeri(Buffer: pchar; rlaenge: DWord): Integer;
var
  BytesTransferred: DWord;
  test : boolean;
  lasterr : dWord;
begin
  test := ReadFile(Seri, Buffer^, rlaenge, BytesTransferred, nil);
  ReadSeri:=BytesTransferred;

end;

//==============================================================================
// Diese Funktion öffnet die Serielle Schnittstelle
//==============================================================================
procedure OpenSeri;
var CommTimeOut : TCOMMTIMEOUTS;
    Status     : Boolean;
    CommBuffer : Integer;
    DCBdaten   : TDCB;

begin
  if Seri<>0 then exit;
  Seri := CreateFile('Com1', GENERIC_WRITE or GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
  if Seri = INVALID_HANDLE_VALUE then
  begin
     Form1.StatusBar1.Simpletext:='Error opening COM';
    Seri := 0;
    exit;
  end;

      ...... // Hier sind noch ein paar Einstellungen, aber die sind für den Programmablauf nicht wirklich wichtig

  Form1.StatusBar1.Simpletext:= 'RS232 at COM1 ready!';
end;

//==============================================================================
// Testfunktion
//==============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var buf   : array [0..12] of Char;
    ack   : array [0..12] of Char;
    i,a   : Integer;
    itest : integer;
    ihelp : integer;
begin

  OpenSeri;
  // String zum Schreiben zusammenstellen
  buf[0] := Chr(7);
  buf[1] := Chr(0);
  buf[2] := Chr(0);
  buf[3] := Chr(0);
  buf[4] := Chr(0);
  buf[5] := Chr(0);
  buf[6] := Chr(0);
  buf[7] := Chr(0);
  buf[8] := Chr(0);
  buf[9] := Chr(0);
  buf[10] := Chr(0);
  buf[11] := Chr(0);
  buf[12] := Chr(0);
  itest := writeSeri(buf, 13);
  form1.ListBox1.items.add('Bytes transferred: ' + IntToStr(itest) + ' Seri: ' + IntToStr(SERI));
  itest := readSeri(ack,13);
  form1.ListBox1.items.add('Bytes received: ' + IntToStr(itest) + ' Seri: ' + IntToStr(SERI));
  if itest > 0 then
  begin
    .....
  end;
end;
Und ich habe den kompletten Source durchgebuggt. Schreiben klappt einwandfrei und wenn ich über Terminal den gleichen Befehl wie über Delphi absetze, dann kommt auch ne Rückmeldung. Ich hab auch schon ein Terminal ans andere Ende der COM gesetzt und geguckt, ob das was Delphi sendet auch ok ist, und da gibt es dann auch keine Klagen. :wall:

blackmice 15. Nov 2007 10:07

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Könnte es unter Umständen sein, dass ReadFile auf etwas wartet, dass aber nicht gesendet wird? Etwas was ein Terminal aber ignorieren würde?

Luckie 15. Nov 2007 11:21

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Zitat:

Zitat von blackmice
Delphi-Quellcode:
function ReadSeri(Buffer: pchar; rlaenge: DWord): Integer;
var
  BytesTransferred: DWord;
  test : boolean;
begin
  test := ReadFile(Seri, Buffer^, rlaenge, BytesTransferred, nil);
  ReadSeri:=BytesTransferred;
end;
bekomme ich zwar ein TRUE zurück

Wo bekommst du da True zurück? Du bekommst die Anzahl der gelesenen Bytes zurück. Die Variable test dürfte der Compiler wohl weg optimieren.

Und unter was für einen Betriebssystem soll das laufen? Ich bin bisher davon ausgegangen, dass NT basierende Systeme keinen direkten Hardwarezugriff mehr zu lassen. :gruebel:

blackmice 15. Nov 2007 11:36

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Also als ich das letzte Mal geguckt hab, hatte ich Windows XP auf dem Rechner.

Ein Teil der Software ist von meinem Vorgänger übernommen, der hat das so geregelt. Und in einem anderen Programm mit anderer Hardware dran, funktioniert das auch einwandfrei. Wie gesagt, das Schreiben funktioniert, die Hardware am anderen Ende tut auch, was sie tun soll, aber ich muss am Anfang eine Statusprüfung machen, und da bekomm ich halt die Werte nicht eingelesen.

Tja, und was das mit dem TRUE anbelangt, so hab ich ne Testversion gehabt, in der ich Test auf dem Monitor ausgegeben habe. Oder aber beim Debuggen geprüft hab.

marabu 15. Nov 2007 11:55

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Hallo,

ReadFile() ist eine boolsche Funktion, das CreateFile() ist in jeder Hinsicht korrekt. Dass OpenSeri() bei Misserfolg nur einen Statustext setzt, gefällt mir weniger - ich würde es zu einer Funktion machen, welche das Handle zurückgibt. So wie es jetzt implementiert ist kann die Hardware auf COM2 aufgeschaltet werden und das Programm versucht auf dem falschen Port zu schreiben und zu lesen.

Ich vermisse die Konfiguration der Schnittstelle mit SetCommState() und eine eventuelle Puffer-Dimensionierung per SetupComm().

Freundliche Grüße

blackmice 15. Nov 2007 13:47

Re: Readfile liefert TRUE aber 0 BytesTransferred
 
Der Teil ist im Bereich ...

Ich hab einiges beim Posten weggelassen. Den genauen Teil kann ich jetzt aber nicht mehr auflisten, weil ich zu Hause den Source nicht habe.
In OpenSeri ist auch vorher schon eine Fehlermeldung, falls COM1 nicht angesprochen werden kann. Die hab ich aber auch erst mal nicht gepostet, sonst wären hier 3 Seiten Source angekommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:14 Uhr.

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