PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Delphi Prob



Artemis_Simetra
18.10.2012, 19:54
Hallo zusammen,
ich hätte da ein problem mit delphi (borland d4)

Ich möchte einen USB_IRTransceiver mit Delphi ansprechen um einen asuro fernzusteuern.
Der Transceiver meldet sich als virtuelle ser.Schnittstelle (COM9) an.
Das wär der Code:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Edit1: TEdit;
ButOpenCOM: TButton;
ButCloseCom: TButton;
ButExit: TButton;
Label1: TLabel;
GroupBox2: TGroupBox;
ButSend: TButton;
procedure ButExitClick(Sender: TObject);
procedure ButOpenCOMClick(Sender: TObject);
procedure ButSendClick(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;
Port: THandle;

implementation

{$R *.DFM}

procedure TForm1.ButExitClick(Sender: TObject);
begin
CloseHandle(Port);
Close;
end;

procedure TForm1.ButOpenCOMClick(Sender: TObject);
begin
Port := CreateFile(PChar('Edit1.Text'),GENERIC_WRITE,0,NIL ,OPEN_EXISTING,0,0);
end;

procedure TForm1.ButSendClick(Sender: TObject);
var
befehl: Byte;
Count: DWORD;

begin
befehl := 80;
WriteFile(Port,befehl,1,Count,NIL);

end;



end.


Das Problem: Der USB-IR-T reagiert nicht. MAn sieht weder die beim senden sonst flackernde gelbeLED noch (mit HandyCam) die IR_LED leuchten.
Kann da jemand helfen?

markusj
18.10.2012, 20:35
Du musst die Parameter der seriellen Schnittstelle doch konfigurieren. Beim ASURO sind das 2400 Baud, 8 Bit, keine Parität, 1 Stoppbit (auch bekannt als 8N1). Ein Codebeispiel das ich auf die schnelle Gefunden habe: http://alexmogurenko.com/blog/programming/windows-working-asynchronously-with-com-port-on-delphilazarus/

mfG
Markus

Artemis_Simetra
22.10.2012, 18:41
So?

procedure TForm1.ButConfigComClick(Sender: TObject);
var
DCB: TDCB;

begin
GetCommState(Port,DCB);
DCB.BaudRate := 2400;
DCB.ByteSize := 8;
DCB.StopBits := ONESTOPBIT;
DCB.Parity := NOPARITY;
SetCommState(Port,DCB);
end;
vg malte

markusj
22.10.2012, 20:03
Schaut plausibel aus. Ich habe aber schon Jahre nicht mehr mit Delphi gearbeitet und dabei noch nie eine seriellen Schnittstelle verwendet. Probiere das ganze doch Mal aus, kaputt gehen kann nichts dabei ...

mfG
Markus

Artemis_Simetra
25.10.2012, 17:23
Das ausprobieren hat ergeben: Will immer noch nicht. Normalerweise blinkt beim Senden eine gelbeLED und man sieht die IRLED mit der Handykammera leuchten.
Hier keins von beidem.
Kennt jemand einen anderen Weg die ser. anzusprechen als über CreateFile+Handle?
vg malte

hagbart06
25.10.2012, 20:11
Ich habe bisher immer die TComPort Komponente verwendet. Zu finden z.B. hier: http://sourceforge.net/projects/comport/

Ist wesentlich einfacher als über CreateFile, da man die Events nutzen kann um zum Beispiel auf eingehende Daten zu reagieren.

Andre_S
25.10.2012, 21:46
Hallo,

ich schließe mich da Kevin an, habe diese Komponente, allerdings mit Delphi 7, viele Jahre genutzt.
Und habe damit nie Probleme gehabt...


Gruß andré

Artemis_Simetra
26.10.2012, 15:18
Ich hab grad auf der Seite von arexx folgendes über das FlashTool (das wenn ich das richtig verstanden hab auch den Treiber für die virtuelle Schnittstelle beinhaltet) folgendes gefunden: Das neue ASURO Flash nutzt nicht mehr den VCP Treiber von FTDI, sondern die D2XX Version! Das bedeutet, dass Sie den USB IR Adapter nicht mehr wie einen normalen Comportanschluss benutzten können.
Könnte es daran liegen das das mit dem öffnen via createfile so gar nicht klappt?
vg malte

hagbart06
26.10.2012, 18:36
Wird den eine serielle Schnittstelle im Geräte-Manager angezeigt? Wenn ja muss diese eigentlich auch funktionieren. Wie gesagt, mit CreateFile würde ich mich nicht weiter beschäftigen, da die Komponente vieles einfacher macht.
Wenn aber keine Schnittstelle angezeigt wird, nehme ich an das man das ganze via USB anspricht. Wie das dann im Detail funktioniert kann ich leider nicht sagen. Ich habe bisher nur mit dem Microchip USB Framework gearbeitet und dort ist eine dll mit den Funktionen zum ansprechen der USB Schnittstelle enthalten.

edit: Ich hab grade gesehen das die TComPort erst ab Delphi 5 funktionieren soll. Von daher wird es mit dieser wahrscheinlich nicht klappen. Ich habe aber grad nochmal deinen Quelltext angeschaut.

Probier es mal so:

procedure TForm1.ButOpenCOMClick(Sender: TObject); begin
Port := CreateFile(PChar(Edit1.Text),GENERIC_WRITE,0,NIL,O PEN_EXISTING,0,0);
end;

Die Anführungszeichen bewirken, dass nicht dein eingegebener Text als Name der Schnittstelle genommen wird, sondern eben der String Edit1.Text. Diese Schnittstelle existiert natürlich nicht.

Artemis_Simetra
28.10.2012, 10:29
Hallo,
@ hagbart: stimmt, danke, ist korrigiert.
Ich würde gerne ohne Komponente auskommen, auch weil das ganze ja eigentlich "nur" beim drücken verschiedener Tasten verschiedene chars senden soll.
Ich vermute es liegt wirklich am Treiber: Für den USB->SER Chip der auf dem IR-Transceiver gibts so wie ich das zurzeit überblicke 2 möglickeiten: VCP (Virt.COM Port) und d2xx (Zugriff usb über ein DLL [??] ) Bisher hatte ich lezteres. Wie werd ich den jetzt los und wo gibts den VCP? wenn ich die alten Treiber über den Gerätemanager deinstalle und den USB-IR-T neu anschließe holt er sich automatisch die alten wieder.
vg malte

Nachtrag: Alternativer Ansatz:
Kann ich mit Delphi so eine Art "virtuelle Eingabe" ins Hyperterminal machen. Also so tun als hätte man eine Tastaturtaste gedrückt? vg M.

hagbart06
28.10.2012, 15:49
Ich kann dir nicht mehr so ganz folgen. Ist jetzt eine serielle Schnittstelle (COM) vorhanden oder nicht? Die entsprechenden Treiber sollte der Hersteller eigentlich bereitstellen.

Kannst du via Hyperterminal Daten an den Receiver senden oder hat das mit deinem Problem nichts zutun. Weil wenns mit Hyperterminal funktioniert sollte es auch direkt aus Delphi funktionieren. Ich glaube nämlich nicht das es einfacher ist Tastatureingaben zu simulieren (habe leider keine Erfahrung mit dem Thema), anstatt die Daten direkt mit deinem Delphi Programm zu versenden.

Artemis_Simetra
28.10.2012, 16:46
Hyperterminal funktioniert ohne jedes Problem. Und im GeräteManager wird COM9 als USB-SeriellPort auch angezeigt.
Nur wenn er auf Delphi hören soll stellt er sich "taub".
vg malte

hagbart06
28.10.2012, 16:58
Auf dieser Seite http://www.entwickler-ecke.de/topic_Serielle+Schnittstelle+ansprechen+und+pollen _36037,0.html ist ein sehr ausführliches Tutorial zu dem Thema. Ich gehe davon aus, dass bei deiner Initalisierung etwas schief läuft. Also am besten mal das Tutorial durch arbeiten und vergleichen.

Artemis_Simetra
28.10.2012, 17:43
danke, ich schaus mir nach den ferien an, bisdahin: schöne woche!

Artemis_Simetra
07.11.2012, 11:03
Leider hat auch das im von kevin genanntem tutorial keinen erfolg gebracht :(
Der Transceiver stellt sich weiterhin tot.
Gibt es eine (gut dokumentierte/beschriebene) Komponente die auch schon ab d4 läuft?
Oder hat jemand eine Idee wie man Tastatureingaben ins HT simuliert?
vg Malte

Andre_S
07.11.2012, 12:22
Hallo Malte,

da Du "wahrscheinlich" nicht der D4 Profi bist,... warum wechselst Du nicht einfach mal die Programmierumgebung. Versuche es doch mal mit den freien MS Express Versionen. In C#, Basic etc. hast Du Dich eventuell schneller als gedacht eingearbeitet...

In D4 kann ich Dir leider mit Tastensimulation auch nicht helfen, habe das zuletzt mit C# gemacht. Halte es für den Fall aber auch nicht für sehr sinnvoll, da man schlecht auf Events reagieren kann.


Gruß André

Artemis_Simetra
07.11.2012, 15:47
Andere Umgebungen sind insofern schlecht, als das ganze als GFS für den Info_Unterricht an der Schule gedacht ist, und da wird nur mit Delphi gearbeitet.
Das mit dem reagieren auf Events wäre nicht das Problem. Ich will ja nur je nach Tastendruck verschiedene ASCIIs ausgeben. Wobei ein direkter Zugriff über Delphi natürlich wesentlich eleganter und besser zu erweitern wäre (-> mir schon die liebere Lösung).
Aber mit Create und Write Filefunktionen hat das auf meinem Wxp bisher nun mal nicht funktioniert.
vg Malte

markusj
07.11.2012, 16:42
Ein Gedanke noch: Da da ja ein FTDI-Chip im IR-Transceiver drin steckt, könntest du direkt über den FTDI-Treiber arbeiten. Ich hatte das vor einigen Jahren damit experimentiert, FTDI liefert dazu bereits Codeschnipsel zur Integration der DLL mit.

mfG
Markus

Andre_S
08.11.2012, 08:02
Andere Umgebungen sind insofern schlecht, als das ganze als GFS für den Info_Unterricht an der Schule gedacht ist, und da wird nur mit Delphi gearbeitet.
Das mit dem reagieren auf Events wäre nicht das Problem. Ich will ja nur je nach Tastendruck verschiedene ASCIIs ausgeben. Wobei ein direkter Zugriff über Delphi natürlich wesentlich eleganter und besser zu erweitern wäre (-> mir schon die liebere Lösung).
Aber mit Create und Write Filefunktionen hat das auf meinem Wxp bisher nun mal nicht funktioniert.
vg Malte
Hallo Malte,

also wenn Ihr mit einer fast 15 Jahre alten Entwicklungsumgebung arbeiten müsst und Du mit der von Kevin geposteten TComPort Komponente, (COM-Library) nicht klar kommst,
http://sourceforge.net/projects/comport/
welche unter D4 lauffähig und wenn erst einmal eingebunden recht einfach zu nutzen ist, fällt mir leider nichts mehr ein. Das einzig "hinderliche" ist die Einbindung, welche aber für jede Delphi Version beschrieben ist.

So alte Beispiele habe ich im Original nicht mehr gefunden, wenn überhaupt habe ich diese in D7 weiter genutzt.
Hier noch eine Komponente zum Verständnis der Funktionalität:
http://www.delphipraxis.net/126702-komponente-fuer-serialport.html (http://www.delphipraxis.net/126702-komponente-fuer-serialport.html)


Gruß André

hagbart06
08.11.2012, 21:10
Die TComPort ist laut Seite nur von D5-XE2 lauffähig (vielleicht funktioniert eine ältere Version z.B. http://sourceforge.net/projects/comport/files/comport/2.64/).
In dem von André geposteten Link, hast du quasi alle Funktionen um den ComPort zu benutzen. Du musst nur noch die ComNo und die Baudrate anpassen, dann sollte es funktionieren. Deswegen würde ich das auch zunächst probieren.


Zum Thema Tastendruck simulieren: Ich glaube mal es ist wesentlich einfacher den ComPort zu benutzen, als einen Tastendruck in einem fremden Programm zu simulieren.

Andre_S
09.11.2012, 07:06
Hallo Kevin,

bin als Orientierung und zum besseren Verständins auch für den letzten Link, allerdings sind in der comport411f.zip die Package ab D3 enthalten,... soweit ich weiß ist es aber nach der Erweiterung nicht mehr auf Versionen vor D5 getestet worden. Ist halt alles ein etwas lange her.


Gruß André

Artemis_Simetra
25.11.2012, 16:00
Hallo,
Sry, das ich in letzter Zeit nicht mehr geantwortet hab, aber ich hatte recht viel Stress mit Klausuren etc.
Danke für eure Antworten.
Ich hab jetzt TComPort und werd mal schauen obs damit geht.
vg malte

Artemis_Simetra
02.12.2012, 16:31
Hallo zusammen,
wenn ich die TComPort verwende, lässt sich das Prog nicht ausführen: CPort.dcu nicht gefunden.
Hab ich da bei der Installation was falsch gemacht?
vg malte

Artemis_Simetra
06.12.2012, 15:27
Nachdem ich den kompletten Satz an Dateien der Komponente in den Projektordner gepackt habe funktionierts jetzt.
Allerdings: so wirklich elegant ist es nicht wenn man eine Komponente in den Projektordner mit rein packt oder?
vg malte

Artemis_Simetra
14.12.2012, 17:18
Nachdem das Prog nun für das drücken von DelphiButtons funktioniert, wollte ich es so erweitern, dass man auch per Tastatur steuern kann.
Allerdings gibts da wider Probleme.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if(key = 'q')then ComPort1.WriteStr('q');
end;
funktioniert nicht so wie gedacht.
Kann da jemand helfen?
VG malte