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.