AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

COMIO Verständnisproblem

Ein Thema von soulfly79 · begonnen am 26. Jan 2007 · letzter Beitrag vom 29. Jan 2007
Antwort Antwort
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
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: COMIO Verständnisproblem

  Alt 26. Jan 2007, 15:37
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.
Andreas
  Mit Zitat antworten Zitat
soulfly79

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

Re: COMIO Verständnisproblem

  Alt 26. Jan 2007, 19:21
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
  Mit Zitat antworten Zitat
soulfly79

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

Re: COMIO Verständnisproblem

  Alt 29. Jan 2007, 07:19
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
  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 11:49 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