Thema: Delphi Com Port Programmierung

Einzelnen Beitrag anzeigen

J Kadison

Registriert seit: 8. Sep 2007
Ort: Ebertsheim
96 Beiträge
 
Delphi 7 Personal
 
#1

Com Port Programmierung

  Alt 10. Okt 2009, 11:16
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?
MFG
Joshi
  Mit Zitat antworten Zitat