Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Kommunikation mit virtuellem ComPort? (https://www.delphipraxis.net/60789-kommunikation-mit-virtuellem-comport.html)

HorstBS 12. Jan 2006 10:04


Kommunikation mit virtuellem ComPort?
 
Hallo,
ich versuche nun schon seit einiger Zeit verzweifelt auf ein externes Geraet zuzugreifen, was ueber den USB Port mit meinem PC verbunden ist. Es handelt sich um einen USB Analog Digital Wandler.
Mitlerweile bin ich schon so weit und weiß, dass der Wandler sich ueber einen virtuellen ComPort bei meinem PC anmeldet. (bzw. kann ich es nur vermuten, da mir weder ein solcher Port angezeigt wird, noch das in der Anleitung genauer darauf eingegangen wird).

Ich moechte ein Delphi Programm schreiben, dass sich mit dem Wandler verbindet, ihm Befehle sendet und die Antworten empfaengt. Das ganze funktioniert sogar schon bei einem normalen Com Port nur leider nicht bei diesem virtuellen. Bei dem AD-Wandler lag auch ein C++ Programm bei, welches genau dies schafft, was mein Programm schaffen soll (verbinden,kommunizieren). Allerdings verstehe ich mit viel von C++. Das Programm verbindet sich mit 'ELV USB-AD-Wandler'.

Wenn ich das bei Delphi versuche
Delphi-Quellcode:
ComHandle := CreateFile(pchar(ELV USB-AD-Wandler), GENERIC_READ or GENERIC_WRITE,
                        0, nil, OPEN_EXISTING, 0, 0);
passiert jedoch nichts.

Kennt sich jemand mit dem Thema aus? Es muss doch eine Moeglichkeit geben mit diesem Ding zu kommunizieren?!

MfG HorstBS

Der_Unwissende 12. Jan 2006 10:51

Re: Kommunikation mit virtuellem ComPort?
 
Hi,
was heißt denn es passiert nichts? Wie sieht denn dein Handle aus? Negativ, Null oder Positiv? Am besten vorher mit Null initieren und dann schauen ob es sich geändert hat.
Ansonsten wäre es noch schön, wenn du genauer beschreiben könntest, was dein Problem ist. Ich meine jetzt was genau du getan hast und welche Art von Fehler du bekommen hast. Oder poste die Stellen C-Code die du nicht verstehst, auch da kann man dir dann sicherlich leichter helfen

Gruß Der Unwissende

HorstBS 12. Jan 2006 11:16

Re: Kommunikation mit virtuellem ComPort?
 
Hi, also ich versuch mal meinen Code hier auszugeben damit man ungefaehr nachvollziehen kann was ich bisher gemacht hab.

Delphi-Quellcode:
const comport = 'ELV USB-AD-Wandler';
Delphi-Quellcode:
procedure TForm1.VerbindenClick(Sender: TObject);
  var DCB    : TDCB;
  var TimeOut : TCommTimeouts;
begin
  connect:=false;
  i:=1;
  while (ComHandle <= 0) and (i < 10) do
  begin
    ComHandle := CreateFile(pchar(comport), GENERIC_READ or GENERIC_WRITE,
                            0, nil, OPEN_EXISTING, 0, 0);
    inc(i);
  end;

  if (i > 10) then
  begin
    memo1.lines.add('Verbindung fehlgeschlagen');
    i:=0;
  end;

  if (ComHandle > 0) then
  begin
    memo1.lines.add('Verbindung hergestellt');
    memo1.Lines.add(inttostr(ComHandle));
    connect:=true;

    DCB.DCBlength := SizeOf(DCB);
    DCB.ByteSize := 8;
    DCB.Parity := NoParity;
    DCB.StopBits := ONESTOPBIT;
    DCB.BaudRate := 38400;
    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(ComHandle, DCB);
    GetCommTimeOuts(ComHandle, TimeOut);

    TimeOut.ReadIntervalTimeOut := 100;
    TimeOut.ReadTotalTimeoutMultiplier := 0;
    TimeOut.ReadTotalTimeoutConstant := 250;

    TimeOut.WriteTotalTimeoutMultiplier := 0;
    TimeOut.WriteTotalTimeoutConstant := 200;
    SetCommTimeouts(ComHandle, TimeOut);
  end;
end;
So versuche ich Kontakt zum ComPort bzw. zu dem AD-Wandler aufzubauen.
Mein PC selber hat zwei ComPorts: Com1 und Com3.
Wenn ich diese ansteuer (also comport:='com1';)
erhalte ich als Antwort
Zitat:

Verbindung hergestellt
96
und bei com3:
Zitat:

Verbindung hergestellt
112
Wenn ich jetzt irgendwelche anderen Ports angebe zb. comport:='com5'; , dann erhalte ich folgende Meldung:
Zitat:

Verbindung hergestellt
4294967295
Also eine Art Fehlermeldung. Und eben di erhalte ich auch wenn ich verscuhe 'ELV USB-AD-Wandler' anzusprechen.

Ansonste versuche ich noch Informationen an das Geraet zu senden mit folgendem Code:
Delphi-Quellcode:
procedure TForm1.SendenClick(Sender: TObject);
  var send : Integer;
  var text : String;
begin

  if (connect) then
  begin
    text:= chr(50); //ASCII "1"
    send := FileWrite(ComHandle, Text[1], Length(Text));

    //Fehlerueberpruefung
    if (send <> Length(Text)) then memo1.lines.add('Senden fehlgeschlagen')
    else memo1.lines.add('Senden OK');
    form1.Antwort.Caption:='"'+inttostr(send)+'" und '+inttostr(length(Text))+'"';
  end;
end;
Bei Com1 und Com3 bekomme ich "Senden OK" , bei den anderen Eingaben erhalte ich als Antwort "Senden fehlgeschlagen", wobei send=-1 und length(Text)=1 sind.

Ich hab echt kein Plan wie ich auf das Ding zugreifen soll und von dem C++ Programm versteh ich wie gesagt nicht viel.. Da es aus mehreren Dateien besteht die alle aufeinander zureuckgreifen ist es auch schwer irgendwas zurueck zuerfolgen oder irgendeinen Code zu posten.
Hoffe meine Angaben stellen das Problem ein bisschen besser dar.
MfG HorstBS

Robert Marquardt 12. Jan 2006 11:17

Re: Kommunikation mit virtuellem ComPort?
 
Wo hast du denn nach dem virtuellen COM Port Asusschau gehalten?
Im Geraetemanager unter "Anschlüsse (COM und LPT)" sollte er auftauchen. Er sollte verschwinden sobald man das Geraet abzieht.

COM3 duerfte der UAD 8 sein.

DerDan 12. Jan 2006 11:28

Re: Kommunikation mit virtuellem ComPort?
 
Und für den Zugriff auf Com-Ports (visrtuell odern nicht) gibt es fertige Komponenten, ich nutze zum Beispiel die Lib CPort CportLib


mfg

DerDan

HorstBS 12. Jan 2006 11:41

Re: Kommunikation mit virtuellem ComPort?
 
Hallo, die Idee hatte ich auch schon allerdings stehen dort nur 2 Geraete:
Druckeranschluss (LPT1) und Kommunikationsanschluss (Com1). Keiner der beiden verschwindet sobald ich das Kabel entferne.
Die Vermutung das Com3 der virtuelle Port ist liegt wohl nahe aber kann ich da sicher sein?
Jemand meinte das es sich dabei nur um einen Modemanschluß handelt.
Außerdem muesste ich doch eine Antwort erhalten, sobald ich etwas schicke oder?

Meine Empfangs Funktion sieht so aus:
Delphi-Quellcode:
procedure TForm1.readbufClick(Sender: TObject);
VAR
  anzahl  : integer;
  buf     : string;
BEGIN
  anzahl := 100;
  SetLength(buf, Anzahl);
  If anzahl > 0 then
  begin
    FileRead(ComHandle, buf, anzahl);
    form1.Antwort.Caption:='"'+buf+'"';
    form1.antwort.Update;
  end
  else
    form1.Antwort.Caption:='fehlgeschlagen';
END;
Vielleicht liegt da der Fehler??

Ich versuche es nochmal mit com3.
MfG HorstBS

HorstBS 12. Jan 2006 11:54

Re: Kommunikation mit virtuellem ComPort?
 
Mit den Komponenten hab ichs schon versucht aber die bringen mich auch nicht weiter..ich kann mich auch nur mit Com1 oder Com3 verbinden. Und wenn ich zb sachen an Com3 sende dann passiert auch nichts. Die examples die dabei sind kann man vergessen. Hab auch schon andre ausprobiert damit hatte ich genauso wenig Erfolg.

HorstBS 12. Jan 2006 12:07

Re: Kommunikation mit virtuellem ComPort?
 
Ich hab nochmal nen bisschenmit den Komponenten rumprobiert und bin darauf gestoßen das com3 doch der Modemanschluß ist. Das steht zumindest da in der Taskleite wenn ich ne Verbindung hab (Also von Windows aus). Also bin ich soweit wie vorher .. :(

Der_Unwissende 12. Jan 2006 12:15

Re: Kommunikation mit virtuellem ComPort?
 
So, erstmal zu Com 1 und 3, wieviele RS232 Schnittstellen hat denn dein Mainboard? (sorry falls du das schon beantwortet haben solltest, hab es dann nur nicht gelesen). Wenn es nur 1 gibt, müsste die andere eigentlich virtuell sein.
Dann wäre die andere Frage, was lag denn genau dem Board bei? Die Anleitung die du gepostet hast ist zwar ganz nett, aber weder ein SDK noch irgendwas was weiterhilft.
Wenn ein Programm beilag (laut Anleitung der Fall), dann schau einfach mal bei Sysinternals.com nach einer Komponente (weiß gerade nicht genau wie die heißt), mit der du die RS232-Schnittstellen belauschen kannst. Die richten sich da sehr Systemnah als virtueller Comport ein und schneiden alles mit. Erst dieses Programm starten und mit deinem Rechner (lokal) verbinden, prüfen dass auf allen Ports gelockt wird (Com 1 + 3) und dann das mitgelieferte Programm von ELV starten. Wenn es dann etwas über einen virtuellen Comport sendet, sollte das auch von Sysinternals erkannt und geloggt werden. Da siehst du dann schonmal was sie senden und über welchen Port.

An sich funktionieren die virtuellen Comport wirklich sehr analog zu den Realen. Hab da einen mit RJ45-Buchse, der hat eigentlich ohne Probleme funktioniert.

Wenn dass alles nicht hilft, wäre es wie gesagt schön, wenn du ein Teil des SDK oder so posten könntest. Die C-Beispielprogramme könntest du auch einfach als Verzeichnis packen und mit der Attachment-Funktion anhängen.

Gruß Der Unwissende

PS:
Ok, das mit dem Comport hat sich gerade geklärt. Hast du denn die USB-Treiber installiert? Und wird irgendwas von Windows installiert, sobald du den AD-Wandler ansteckst?

Robert Marquardt 12. Jan 2006 12:41

Re: Kommunikation mit virtuellem ComPort?
 
Koenntest du mal erzahlen was im Geraetemanager an COM Ports aufgefuehrt ist?
Insbesondere dabei den UAD 8 an- und abstecken.

HorstBS 12. Jan 2006 13:56

Re: Kommunikation mit virtuellem ComPort?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich hab es jetzt mal so gemacht wie Der_Unwissende gesagt hat:
(Benutzt habe ich das Programm PortMonNT)
Also..das Programm zeigt mir auch nur Com1, Com3 und meinen Druckeranschluß an. Wenn ich das Beigelegte Programm starte, welches ja auch Sensorwerte zurueckliefert, dann zeigt das Programm trotzdem nichts an.
Wenn ich mein Delphi Programm starte 'com1' und 'com3' so werden die Aktionen angezeigt.
Also ich weiß wirklich nichtmehr weiter. Wahrscheinlich war die Vermutung das es sich hier um ein virtuellen Com Port handelt falsch.

Damit waer ich wieder bei der alten Frage:
Wie kmmuniziere ich ueber den USB-Port..

Ich hab echt keine Idee mehr wie ich mit dem scheiß Teil kommunizieren soll. Ich hab jetzt auch mal das C++ Programm angehaengt, so wie es bei der Diskette beilag...

Es muss doch irgendwie gehen?!

Robert Marquardt 12. Jan 2006 14:24

Re: Kommunikation mit virtuellem ComPort?
 
Du waerst schon viel weiter wenn du auf die Fragen geantwortet haettest. :-(
Ob ein Treiber und eine DLL mitgeliefert werden wurde naemlich schon gefragt.

Mit dem Zip ist nun alles klar. Es ist kein virtueller COM Port, sondern das Geraet hat einen eigenen Treiber, der ein API aehnlich dem fuer COM Ports hat.
Die entscheidenden Dateien sind Ftd2xx.h und Ftd2xx.dll. Fuer Delphi muss man Ftd2xx.h nach Pascal konvertieren und dann kann man die Funktionen der DLL ansteuern.

HorstBS 12. Jan 2006 15:04

Re: Kommunikation mit virtuellem ComPort?
 
Ajo danke fuer den Hinweis jetzt bin ich wenigstens schonmal davon weg nach irgendeinem Com-port zu suchen..
Zitat:

Fuer Delphi muss man Ftd2xx.h nach Pascal konvertieren und dann kann man die Funktionen der DLL ansteuern
Das sagt mir jetzt rellativ wenig^^ Wie konvertier ich das denn?

MfG HorstBS

Airblader 12. Jan 2006 15:29

Re: Kommunikation mit virtuellem ComPort?
 
Ich tippe mal auf übersetzen, also basierend darauf neu schreiben.

Aber noch was zum 1. Posting:

Delphi-Quellcode:
i:=0;
while i<10 do
begin
 // blubb
 inc(i);
end;

if i>10 then
begin
 // <-- hier
end;
Markierte Stelle wird nie eintreten, da max. i=10 sein kann, nicht jedoch i>10 ;)

air

Der Jan 12. Jan 2006 15:41

Re: Kommunikation mit virtuellem ComPort?
 
Zitat:

Zitat von HorstBS
Ajo danke fuer den Hinweis jetzt bin ich wenigstens schonmal davon weg nach irgendeinem Com-port zu suchen..
Zitat:

Fuer Delphi muss man Ftd2xx.h nach Pascal konvertieren und dann kann man die Funktionen der DLL ansteuern
Das sagt mir jetzt rellativ wenig^^ Wie konvertier ich das denn?

MfG HorstBS

Der Header sollte problemlos zu konvertieren sein, enthält keine Klassen, nur Funktions- Konstanten- und Enum-Definitionen. Du kannst das manuell versuchen, da gibts hier im Forum auch Beiträge dazu, oder du nimmst Dr.Bob's HeadConv .

Robert Marquardt 12. Jan 2006 16:37

Re: Kommunikation mit virtuellem ComPort?
 
HeadConv wird versagen. Es sind Strukturen mit Bitfeldern enthalten, die Delphi nicht kann.
Ich werde mal sehen ob ich am Wochenende Zeit finde.

Der_Unwissende 13. Jan 2006 08:15

Re: Kommunikation mit virtuellem ComPort?
 
Zitat:

Zitat von Robert Marquardt
Es sind Strukturen mit Bitfeldern enthalten, die Delphi nicht kann.

Vielleicht sehe ich die ja nur nicht, aber welche sollten dass sein? Wenn du sowas wie
Code:
#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL)
meinst, dann würde ich sagen, dass set of genau das kann.

Wie gesagt, vielleicht sehe ich die nur nicht (oder irre mich total). Das ist unabhängig davon ob HeadConv scheitert oder nicht.

Gruß Der Unwissende

Robert Marquardt 13. Jan 2006 08:21

Re: Kommunikation mit virtuellem ComPort?
 
Delphi-Quellcode:
typedef struct _FTDCB {
    DWORD DCBlength;     /* sizeof(FTDCB)                  */
    DWORD BaudRate;      /* Baudrate at which running      */
    DWORD fBinary: 1;    /* Binary Mode (skip EOF check)   */
    DWORD fParity: 1;    /* Enable parity checking         */
    ...
: 1 heisst in C das die deklarierte Variable 1 Bit lang ist. Da sie vom Typ DWORD aka Cardinal ist, kann sie die Werte 0 und 1 annehmen.
Waere sie vom Typ Integer, dann waeren die Werte 0 und -1. C hat eben einige Alleinstellungsmerkmale.

Der_Unwissende 13. Jan 2006 08:33

Re: Kommunikation mit virtuellem ComPort?
 
Oh ja, die hab ich echt übersehen, gut dann nehme ich alles zurück!

Und wieder was über C gelernt.

HorstBS 13. Jan 2006 10:28

Re: Kommunikation mit virtuellem ComPort?
 
Oje von sowas hab ich ja mal echt keine Ahnung..

Aber im Prinzip brauch ich aus der FTD2XX.H ja nur 4 Funktionen, nämlich öffnen, schreiben, lesen, schließen. Der Rest duerfte fuer meine weitere Arbeit relativ uninteressant sein.

Allerdings kenn ich mich, wie gesagt, wenig mit C++ aus, deshalb weiß ich nicht genau wie ich das Ganze umschreibe.

Also wenn mir jetzt noch jemand sagen koennte wie ich die Funktionen umschreibe (ein Bsp. waer super^^), dann muesste das doch schnell zu machen sein oder?
Anschließend muesste ich nurnoch die .Dll in Delphi einbinden und koennte mit den Funktionen arbeiten. Also kp ob das so geht aber waer auf jeden Fall klasse wenns so "einfach" waer.

Was denkt ihr? Funktioniert das so?

Ansonsten Danke fuer die weiteren hilfreichen Hinweise, die mir wohl nochmehr "sinnlose" Arbeit erspart haben.

MfG HorstBS

HorstBS 16. Jan 2006 12:19

Re: Kommunikation mit virtuellem ComPort?
 
Oh Mann.. ich kriegs einfach nicht zum laufen.. hat nicht noch irgendeiner ne Idee?

Robert Marquardt 16. Jan 2006 13:34

Re: Kommunikation mit virtuellem ComPort?
 
Sorry, ich habe keine Zeit gefunden das File zu konvertieren.

HorstBS 17. Jan 2006 19:22

Re: Kommunikation mit virtuellem ComPort?
 
Also ich bin jetzt soweit, dass ich schon eine Verbindung zum AD Wandler aufbauen kann.
Beim senden/empfangen habe ich nun weitere Probleme:

Eigentlich geht das doch mit diesem Befehl hier
Delphi-Quellcode:
DeviceIoControl(DeviceHandle,$04,@lIn,sizeof(lIn),@lOut,sizeof(lOut),nBytes,nil);
Allerdings verstehe ich noch nicht ganz die Bedeutung der ganzen Parameter.

Zb der zweite Parameter "$04"...mir ist nicht ganz klar was der bewirkt.

Und an der dritten stelle @1IN...ist das nun das Signal was in meinenen Rechner geht oder in den ADWandler? Funktioniert der Befehl einfach so, dass ich einen Datenstring an den Wandler sende (zb jetzt ueber @1IN) und die Antwort ueber @1Out auslese?

MfG HorstBS


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz