AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Readfile liefert TRUE aber 0 BytesTransferred
Thema durchsuchen
Ansicht
Themen-Optionen

Readfile liefert TRUE aber 0 BytesTransferred

Ein Thema von blackmice · begonnen am 15. Nov 2007 · letzter Beitrag vom 15. Nov 2007
Antwort Antwort
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#1

Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 10:29
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
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 10:48
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
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#3

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 11:05
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.
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#4

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 11:07
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?
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 12:21
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#6

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 12:36
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.
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 12:55
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
  Mit Zitat antworten Zitat
blackmice

Registriert seit: 24. Okt 2007
Ort: Niederkrüchten
28 Beiträge
 
Delphi 5 Standard
 
#8

Re: Readfile liefert TRUE aber 0 BytesTransferred

  Alt 15. Nov 2007, 14:47
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.
Blackmice
Debuggers don't remove bugs, they only show them in slow-motion.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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