Hallo!
Ich weiß, es ist ein sehr viel diskutiertes Thema aber jetzt nach 3 stunden internetrecherche hab ich langsam keinen Nerv mehr und ich weiß auch nichtmehr wonach ich genau suchen soll, damit ich endlich das richtige finde.
Und zwar:
Ich habe ein Gerät (Intellibox) an meinen Comport angeschlossen und richte ihn über folgenden
QC ein:
Delphi-Quellcode:
V_ComHandle := CreateFile(PCHAR(aComPort), GENERIC_READ
or GENERIC_WRITE,
0,
nil, OPEN_EXISTING, 0, 0);
if V_ComHandle <> 0
then
begin
{ Einstellungen zum COM-Port zuweisen, wenn die Verbindung aktiv ist }
DCB.DCBlength := SizeOf(DCB);
DCB.ByteSize := 8;
DCB.Parity := NoParity;
DCB.StopBits := TWOSTOPBITS;
DCB.BaudRate := V_BaudRate;
DCB.Flags := 5123;
{ Wenn 2 Pins belegt sind }
DCB.EofChar := #0;
DCB.ErrorChar := #0;
DCB.EvtChar := #0;
DCB.XoffChar := #0;
DCB.XoffLim := 0;
DCB.XonChar := #0;
DCB.XonLim := 0;
SetCommState(V_ComHandle, DCB);
GetCommTimeOuts(V_ComHandle, TimeOut);
TimeOut.ReadIntervalTimeOut := 100;
TimeOut.ReadTotalTimeoutMultiplier := 0;
TimeOut.ReadTotalTimeoutConstant := 250;
TimeOut.WriteTotalTimeoutMultiplier := 0;
TimeOut.WriteTotalTimeoutConstant := 200;
SetCommTimeouts(V_ComHandle, TimeOut);
Bis Dahin ist noch alles Super!
Auch das Senden funktioniert noch.
Delphi-Quellcode:
function TIntellibox.SendData(Text:
String): Boolean;
var
i : Integer;
begin
{ Senden der Daten an den COM-Port - mit Ausgabe ob der Befehl erfolgreich war }
if V_ComHandle <> 0
then
begin
i := FileWrite(V_ComHandle, Text[1], Length(Text));
if (i <> Length(Text))
then Result := False
else Result := True;
end
else result := false;
end;
Allerdings weiß ich jetzt nicht, ob der Befehl auch angekommen ist und ob er ausgeführt wurde.
So weit ich die Dokumentation des Gerätes verstanden habe, sollte ich auch Daten zurück bekommen.
Meine Überlegung war, einen Thread einzurichten, welcher auf ankommende Nachrichten wartet, oder geht soetwas noch einfacher?
Ich weiß es gibt schon viele Komponenten hierzu aber nicht als thread sondern alles nur um selbst die nachrichten abzufragen.
(oder ich bin einfach zu blöd zum googeln)
Hat jemand eine passende lösung um einfach sobald eine NAchricht vom gerät kommt diese abzufangen und auszuwerten?
habe hier gerade noch eine readprozedur gefunden:
habe sie mal für mein verstaändniss kommentiert, bei fehlern bitte melden
Delphi-Quellcode:
function ReadText: string;
var
d: array[1..80] of Char;
s: string;
BytesRead, i: Integer;
begin
// Result initialisierung
Result := '';
// Hier wird vom ComHandle gelesen (gegenteil von oben writefile) und in d geschrieben
if ReadFile(ComFile, d, SizeOf(d), BytesRead, nil) then
begin
// s wird initialisiert
s := '';
// hier wird in s einfach das array of char geschrieben, also prinzipiell s := d
for i := 1 to BytesRead do s := s + d[I];
// das ergebnis ist dann ein string mit den verschiedenen bytes als chars
Result := s;
end
else
// Hier könnte ich jetzt fehler abfangen
end;
muss ich jetzt hier einen threat machen, der immerwieder readtext ausführt oder geht das schöner?