Einzelnen Beitrag anzeigen

soulfly79

Registriert seit: 25. Jan 2007
4 Beiträge
 
#1

COMIO Verständnisproblem

  Alt 26. Jan 2007, 13:01
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
  Mit Zitat antworten Zitat