![]() |
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 ![]() 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:
passiert jedoch nichts.
ComHandle := CreateFile(pchar(ELV USB-AD-Wandler), GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0); Kennt sich jemand mit dem Thema aus? Es muss doch eine Moeglichkeit geben mit diesem Ding zu kommunizieren?! MfG HorstBS |
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 |
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:
So versuche ich Kontakt zum ComPort bzw. zu dem AD-Wandler aufzubauen.
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; Mein PC selber hat zwei ComPorts: Com1 und Com3. Wenn ich diese ansteuer (also comport:='com1';) erhalte ich als Antwort Zitat:
Zitat:
Zitat:
Ansonste versuche ich noch Informationen an das Geraet zu senden mit folgendem Code:
Delphi-Quellcode:
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.
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; 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 |
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. |
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
![]() mfg DerDan |
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:
Vielleicht liegt da der Fehler??
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; Ich versuche es nochmal mit com3. MfG HorstBS |
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.
|
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 .. :(
|
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? |
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. |
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: ![]() 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?! |
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. |
Re: Kommunikation mit virtuellem ComPort?
Ajo danke fuer den Hinweis jetzt bin ich wenigstens schonmal davon weg nach irgendeinem Com-port zu suchen..
Zitat:
MfG HorstBS |
Re: Kommunikation mit virtuellem ComPort?
Ich tippe mal auf übersetzen, also basierend darauf neu schreiben.
Aber noch was zum 1. Posting:
Delphi-Quellcode:
Markierte Stelle wird nie eintreten, da max. i=10 sein kann, nicht jedoch i>10 ;)
i:=0;
while i<10 do begin // blubb inc(i); end; if i>10 then begin // <-- hier end; air |
Re: Kommunikation mit virtuellem ComPort?
Zitat:
![]() |
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. |
Re: Kommunikation mit virtuellem ComPort?
Zitat:
Code:
meinst, dann würde ich sagen, dass set of genau das kann.
#define FT_LIST_MASK (FT_LIST_NUMBER_ONLY|FT_LIST_BY_INDEX|FT_LIST_ALL)
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 |
Re: Kommunikation mit virtuellem ComPort?
Delphi-Quellcode:
: 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.
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 */ ... Waere sie vom Typ Integer, dann waeren die Werte 0 und -1. C hat eben einige Alleinstellungsmerkmale. |
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. |
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 |
Re: Kommunikation mit virtuellem ComPort?
Oh Mann.. ich kriegs einfach nicht zum laufen.. hat nicht noch irgendeiner ne Idee?
|
Re: Kommunikation mit virtuellem ComPort?
Sorry, ich habe keine Zeit gefunden das File zu konvertieren.
|
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:
Allerdings verstehe ich noch nicht ganz die Bedeutung der ganzen Parameter.
DeviceIoControl(DeviceHandle,$04,@lIn,sizeof(lIn),@lOut,sizeof(lOut),nBytes,nil);
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