![]() |
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 |
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 ![]() Ich habe z.B. den TCommPort Driver v.1.08 schon öfters verwendet. Ist zwar alt, aber funktioniert. |
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 ![]() Vielleicht kannst du mir deine Version mal zur Verfügung stellen? Gruß Carsten |
Re: COMIO Verständnisproblem
OK das Problem hat sich geklärt.
Hatte die 16 Bit Version erwischt... Das ist der richtige Driver ![]() 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