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 COMIO Verständnisproblem (https://www.delphipraxis.net/85129-comio-verstaendnisproblem.html)

soulfly79 26. Jan 2007 12:01


COMIO Verständnisproblem
 
HAllo Zusammen,
ich weiß serielle Schnittstelle ist shon oft behandelt worden aber hilft mir alles nicht zum Verständnis.

Ich habe ein GPRS Modem, welches bei einem ankommenden Paket einen Befehl über die Serielle Schnittstelle sendet.

Nun wollte ich genau diesen Eingang, da unerwartet, mit einer Art Interrupt abfangen.

Dazu habe ich mir folgenden Quelltext hier auf der Seite (COMIO.zip) runtergeladen:
Delphi-Quellcode:

var
  frm_main    : Tfrm_main;
  hCommFile   : THandle;
  CommPort    : string;

  ThreadID    : DWORD;
  ThreadHandle : THandle;
  ThreadActive : boolean = false;

implementation

{$R *.dfm}

//ReadFile-Thread Function
function rfThread(p : Pointer) : Integer;
var
  outStr, outHex   : string;
  NumberOfBytesRead : dword;
  Buffer           : array[0..255] of char;
  i                : Integer;
begin
  try //Zur sicherheit ...
    if(hCommFile = INVALID_HANDLE_VALUE)then
    begin
      Application.MessageBox('Kein gültiges Handle zur Datei (hCommFile = INVALID_HANDLE_VALUE)', 'Achtung', MB_ICONWARNING);
      exit;
    end;

    ThreadActive := true;
    frm_main.btn_readfile.Caption := 'ReadFile-Thread beenden';

    //Buffer 'leeren'
    FillChar(Buffer, sizeof(Buffer), #0);

    //ReadFile versucht daten vom ComPort zu lesen, bzw. wartet so lange, bis
    //entweder ein timeout das ganze beendet, oder ein signal eintrifft ...
    if not(ReadFile(hCommFile, Buffer, sizeof(Buffer), NumberOfBytesRead, nil))then
    begin
      Application.MessageBox('Fehler beim Lesen vom ComPort', 'Fehler', MB_ICONERROR);
      frm_main.btn_readfile.Caption := 'ReadFile (threaded)';
      ThreadActive := false;
      exit;
    end;

    if(Buffer = '')then
    begin
      //ReadFile wurde warscheinlich durch ein Timeout 'beendet'
      Application.MessageBox('ReadFile gab nichts zurück. Warscheinlich Timeout.', 'Info', MB_ICONINFORMATION);
      frm_main.btn_readfile.Caption := 'ReadFile (threaded)';
      ThreadActive := false;
      exit;
    end;

    for i := 0 to NumberOfBytesRead - 1 do
      outStr := outStr + Buffer[i];

    //Konvertieung auch in Hexadezimal, denn manchmal bekommt man 'unsichtbare'
    //Zeichen ...
    for i := 0 to Length(outStr) do
      outHex := outHex + IntToHex(ord(outStr[i]),1);

    frm_main.memo_hex.Text := outHex;
    frm_main.memo_text.Text := outStr;
  finally
    ThreadActive := false;
    frm_main.btn_readfile.Caption := 'ReadFile (threaded)';
  end;
end;

procedure Tfrm_main.btn_readfileClick(Sender: TObject);
begin
  //ReadFile ist 'gethreadet', da sonst das Programm ziemlich 'abgestürzt'
  //aussieht ...
  if not(ThreadActive)then //Wenn der thread
    ThreadHandle := BeginThread(nil, 0, @rfThread, nil, 0, ThreadID)
  else
    if(ThreadActive) and not (ThreadHandle = INVALID_HANDLE_VALUE)then
      if not(TerminateThread(ThreadHandle, 0))then
        Application.MessageBox('Fehler bei TerminateThread (= false)', 'Fehler', MB_ICONERROR)
      else
      begin
        ThreadActive := false;
        btn_readfile.Caption := 'ReadFile (threaded)';
      end;
end;

NUN DAS VERSTÄNDISPROBLEM:

Wenn ich den Thread beim connect der Seriellen Schnittstelle mit ' BeginThread(nil, 0, @rfThread, nil, 0, ThreadID)' starte, hängt sich das Programm einfach auf wenn ich daten bekomme.

Wenn ich den Thread kurz bevor ich die Daten erwarte Starte geht alles gut



WO IST DAS PROBLEM?

Gruß Carsten

shmia 26. Jan 2007 14:37

Re: COMIO Verständnisproblem
 
Das Problem ist, dass immer wieder versucht wird, die Ansteuerung der seriellen Schnittstelle selbst zu programmieren.
Das nennt man "das Rad neu erfinden".
Die eigenen Lösungen sind meist viel schlechter als bekannte Komponenten. ("das quadratische Rad erfinden")
Also nimm doch einfach eine Komponente
http://www.torry.net/pages.php?id=198
Ich habe z.B. den TCommPort Driver v.1.08 schon öfters verwendet. Ist zwar alt, aber funktioniert.

soulfly79 26. Jan 2007 18:21

Re: COMIO Verständnisproblem
 
Hallo shmia,
danke dir für den Hinweis hab mich auch gleich an die Arbeit gemacht.

Wollte alles laut ReadMe erledigen, jedoch bringt er mir beim compilieren einen Fehler.

massiv viele undefinierte Bezeichner. (übrigens arbeite mit Delphi6)

Habe folgendes gemacht:
- Komponente installieren...
- Name der Unit -> Durchsuchen -> ComDrv16.pas -> OK

-> bricht ab mit ca 20 Fehlermeldung

http://www.carsten-scheiblich.de/Fehler.jpg

Vielleicht kannst du mir deine Version mal zur Verfügung stellen?

Gruß Carsten

soulfly79 29. Jan 2007 06:19

Re: COMIO Verständnisproblem
 
OK das Problem hat sich geklärt.

Hatte die 16 Bit Version erwischt...

Das ist der richtige Driver http://www.torry.net/vcl/comms/modems/cdd4.zip

Danke nochmal für die schnelle Hilfe

Gruß Carsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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