Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Com Port Programmierung (https://www.delphipraxis.net/141509-com-port-programmierung.html)

J Kadison 10. Okt 2009 11:16


Com Port Programmierung
 
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?

mts 10. Okt 2009 22:57

Re: Com Port Programmierung
 
Warum so aufwendig:
http://sourceforge.net/projects/comport/

Benutze ich seit langer Zeit.

Chemiker 11. Okt 2009 08:57

Re: Com Port Programmierung
 
Hallo J Kadison,

TurboPower Async Prof. benutze ich selber und kann es weiter empfehlen.

http://www.turbocontrol.com/APro.htm

Bis bald Chemiker

Jens Hartmann 11. Okt 2009 09:04

Re: Com Port Programmierung
 
Hallo J. Kadison,

kann ich wie oben beide auch nur empfehlen. Ich nutze zur Zeit für mein Projekt die ComPortLib, und bin sehr zufrieden damit.

Über die Komponente ComDataPacket, kannst du Packetweise von der Schnitstelle empfangen. Das funktioniert immer automatisch, wenn das von die vorher definierte Packet vollständig ist.

Delphi-Quellcode:
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);//In der Const Str befinden sich deine Daten
Über die Komponente ComPort, gibt es verschiedene Varianten, diese sind aber alle in der Hilfe beschrieben. Hier mal eine um den Buffer auszulesen.

Delphi-Quellcode:
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
Viel Spaß

Gruß Jens

J Kadison 18. Nov 2009 23:04

Re: Com Port Programmierung
 
Hallo!
Ich bin's nochmal!

Ich weiß, mit einer Komponente ist es einfacher, aber aus den ganzen kompo's werd ich net schlau :wall:


naja hier nochmal ein versuch, das anders zu lösen ...

und zwar habe ich folgenden QT gefunden:

Code:
Function RecieveByte(COMHandle: THandle): Byte;
Var
  tmp: cardinal;
  ByteToRead: Byte;
Begin
  ReadFile(COMHandle, BytetoRead, 2, tmp, Nil);
  Result := ByteToRead;
End;
Dabei habe ich das Problem, dass ich zwar viele Meldungen bekomme, aber ich habe festgestellt, die kommen nicht von meinem Gerät sondern immer dann, wenn ich etwas an meinem Form mache :(

Zu der Fkt die ich oben schon erwähnt habe, . . . .die liefert überhaupt kein wert :( genauso doof.

Fällt hier jemandem noch was ein?

himitsu 18. Nov 2009 23:11

Re: Com Port Programmierung
 
Ein Byte ist 1 Byte groß und nicht 2 :!:

Delphi-Quellcode:
Function RecieveByte(COMHandle: THandle): Byte;
Var
  tmp: cardinal;
Begin
  ReadFile(COMHandle, Result, 1, tmp, Nil);
End;

R2009 19. Nov 2009 05:11

Re: Com Port Programmierung
 
Hi,
ich nutze auch Asynchpro.
Ist viel einfacher als das was du machen willst. Asynchpro downloaden, entpacken Sourceverzeichnis in dein Projekt eintragen und Comport aufs Formular ziehen.
Das Weitere ist so einfach, dass es keine probleme mehr machen sollte.

Grüsse
Rainer

Hudel1965 19. Nov 2009 11:02

Re: Com Port Programmierung
 
Hi :-)

Ich habe auch eine Software geschrieben, um die IntelliBox von Uhlenbrock (Märklin H0) anzusteuern. Im Prinzip brauchts du keinen Thread um die Antwort zu lesen, das geht synchron. Das Problem dabei ist, wenn die Box etwas länger für die Antwort braucht, hakelt dein Programm. Deshalb habe ich die gesamte Kommunikation in einen Thread ausgelagert, dem ich ein Objekt übergebe welches er interpretiert und dann ausführt. Nach der Ausführung erhalte ich eine Botschaft, über die ich auswerten kann, ob alles geklappt hat.

Gruß

Hudel

J Kadison 23. Nov 2009 12:35

Re: Com Port Programmierung
 
Zitat:

Zitat von Hudel1965
Hi :-)

Ich habe auch eine Software geschrieben, um die IntelliBox von Uhlenbrock (Märklin H0) anzusteuern. Im Prinzip brauchts du keinen Thread um die Antwort zu lesen, das geht synchron.

Darf ich das so verstehn, dass die IntelliBox immer und nur Daten sendet, wenn ich davor welche gesendet habe?
also:
ich sende, ich warte, die IB sendet ???


Ah!

@Hudel

Die Software für die IB ist nicht zufällig in Delphi geschrieben?
Wäre es vielleicht möglich den Source hier offen zu legen oder wenigstens den Teil zum Senden und empfangen?

Hudel1965 23. Nov 2009 13:30

Re: Com Port Programmierung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi :-)

wenn du natürlich auch Meldungen von der IB mitbekommen möchtest, wie Rückmeldekontakte an / aus oder Weiche wurde geschaltet, dann musst du einen Thread verwenden.

Ich hänge mal den Quellcode der Kommunikation mit der IB als ZIP-Datei an. Ja ist in Delphi 2010 geschrieben :-). Achtung der Quellcode kann so nicht verwendet werden. Da ein paar Units fehlen, die ich nicht rausgeben möchte.

Gruß

Hudel


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Seite 1 von 2  1 2      

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