AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Com Port Programmierung
Thema durchsuchen
Ansicht
Themen-Optionen

Com Port Programmierung

Ein Thema von J Kadison · begonnen am 10. Okt 2009 · letzter Beitrag vom 23. Nov 2009
Antwort Antwort
Seite 1 von 2  1 2      
J Kadison

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

Com Port Programmierung

  Alt 10. Okt 2009, 12: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
mts

Registriert seit: 14. Dez 2008
24 Beiträge
 
Delphi XE4 Professional
 
#2

Re: Com Port Programmierung

  Alt 10. Okt 2009, 23:57
Warum so aufwendig:
http://sourceforge.net/projects/comport/

Benutze ich seit langer Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Chemiker
Chemiker

Registriert seit: 14. Aug 2005
1.859 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Com Port Programmierung

  Alt 11. Okt 2009, 09:57
Hallo J Kadison,

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

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

Bis bald Chemiker
wer gesund ist hat 1000 wünsche wer krank ist nur einen.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Hartmann
Jens Hartmann

Registriert seit: 11. Jan 2009
Ort: Wilnsdorf
1.439 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Com Port Programmierung

  Alt 11. Okt 2009, 10:04
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.

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.

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

Gruß Jens
Jens Hartmann
Das Leben selber ist zu kurz, also nutze jeden Tag wie er kommt.
  Mit Zitat antworten Zitat
J Kadison

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

Re: Com Port Programmierung

  Alt 19. Nov 2009, 00:04
Hallo!
Ich bin's nochmal!

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


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?
MFG
Joshi
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: Com Port Programmierung

  Alt 19. Nov 2009, 00:11
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;
$2B or not $2B
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Com Port Programmierung

  Alt 19. Nov 2009, 06:11
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Hudel1965

Registriert seit: 4. Nov 2005
Ort: Köln
32 Beiträge
 
Delphi XE3 Professional
 
#8

Re: Com Port Programmierung

  Alt 19. Nov 2009, 12:02
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
  Mit Zitat antworten Zitat
J Kadison

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

Re: Com Port Programmierung

  Alt 23. Nov 2009, 13:35
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?
MFG
Joshi
  Mit Zitat antworten Zitat
Hudel1965

Registriert seit: 4. Nov 2005
Ort: Köln
32 Beiträge
 
Delphi XE3 Professional
 
#10

Re: Com Port Programmierung

  Alt 23. Nov 2009, 14:30
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
Angehängte Dateien
Dateityp: pas ib_comm_118.pas (19,0 KB, 88x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:50 Uhr.
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