Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi HID USB Gerät (am Bsp. von ELV-SI1) - keine Datenübertragung (https://www.delphipraxis.net/135235-hid-usb-geraet-am-bsp-von-elv-si1-keine-datenuebertragung.html)

moelski 7. Jun 2009 12:16


HID USB Gerät (am Bsp. von ELV-SI1) - keine Datenübertragung
 
Moin !

Ich versuche gerade auf ein USB HID Device zuzugreifen. Es geht um dieses Gerät:
http://www.elv.de/USB-Schaltinterfac.../detail2_24914

Und die Protokoll Beschreibung findet man hier:
http://www.elv-downloads.de/service/...tenrahmens.pdf

Nun nutze ich folgenden Code:
Delphi-Quellcode:
type _lIn = record
    bFunction : Byte;
    bValue1   : Byte;
    bValue2   : Byte;
    bValue3   : Byte;
    bValue4   : Byte;
end;

type _lOut = record
    bAck : Byte;
    bValue1 : Byte;
    bValue2 : Byte;
    bValue3 : Byte;
    bValue4 : Byte;
end;

procedure TForm1.TalkUSB;
var lIn            : _lIn;
    lOut           : _lOut;
    DeviceHandle   : THandle;
    TemplateHandle : THandle;
    nBytes         : DWord;
    bresult        : Boolean;
begin                      //     USB\Vid_1b1f&Pid_c00a&Rev_0000
  DeviceHandle := CreateFile ('\\?\hid#vid_1b1f&pid_c00a#6&4c197d7&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}',
                              Generic_write,
                              File_Share_write,
                              nil,
                              open_existing,
                              0,
                              0);
  if DeviceHandle = INVALID_HANDLE_VALUE then Beep;

  Memo1.Lines.Add('Handle : ' + IntToStr(DeviceHandle) + ' ' + IntToHex(DeviceHandle, 8));
  Memo1.Lines.Add('LastError : ' + IntToStr(GetLastError));

  lIn.bFunction := 01;
  bResult := DeviceIoControl(DeviceHandle,
                             $04,
                             @lIn,
                             sizeof(lIn),
                             @lOut,
                             sizeof (lOut),
                             nBytes,
                             nil);
  Memo1.Lines.Add(BoolToStr(bResult, True));
  Memo1.Lines.Add('LastError : ' + IntToStr(GetLastError));

  CloseHandle (DeviceHandle);
end;
Ich sags gleich ... Der Code funzt so noch nicht 100%, dessen bin ich mir bewusst. Ich hoffe das mir hier jemand ein bissel helfen kann um mit dem Gerät zu "sprechen".

Also, das Devicehandle bekomme ich. Sprich CreateFile funktioniert.
Wenn ich aber danach den LastError auswerte dann bekomme ich 5. Wenn ich diese Liste zugrunde lege:
http://msdn.microsoft.com/en-us/library/ms681382(VS.85).aspx

...ann bedeutet das:
Zitat:

ERROR_ACCESS_DENIED - 5 (0x5) Access is denied.
Es greift aber keine andere Anwendung derzeit auf das Gerät zu.

Ok weiter zu DeviceIoControl ...
Ich weiss das meine Records noch nicht wirklich zu dem passen was das Gerät an Input erwartet bzw. an Output liefert.
Dazu hätte ich dann 2 Fragen ...
1) Wenn ich die Struktur so verwende wie in dem Beispiel oben, müsste dann nicht zumindest eine Kommunikation in Richtung USB Gerät erfolgen? Ich habe hier einen USB Analyser am laufen um mir das Geschehen auf der Leitung anzusehen. Aber es passiert rein gonix. Ich würds ja verstehen wenn ich keinen Response bekomme, aber müsste nicht wenigstens was zum Gerät geschickt werden?
2) Kann mir jemand ein Beispiel zeigen wie ich (aufgrund des vorliegenden Protokolls) meine IN / OUT Records definieren und mit Werten befüllen muss? Mir ist z.B. noch nicht klar ob die Report ID eine Art Sonderrolle darstellt, oder ob man das einfach in dem Record als erstes Byte mit angibt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:40 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