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