Unerfahrener C-User braucht Hilfe
-
Hallo,
habe mit C eigentlich nichts am Hut, aber nun habe ich ein Demo-Programm, das mir Probleme bereitet.
Ich arbeite mit Visual Studio 2008.
Und zwar geht das mit dem USB-Bus irgendwie nicht.
USB View sagt mir 3 Devices Connected (auch das, mit dem ich reden will)Wenn ich aber diesen Code durchsteppe:
struct usb_bus *bus; struct usb_device *dev; uint32_t uiDevIndex; dsp.uiEndPointIn = 0; dsp.uiEndPointOut = 0; dsp.pudh = NULL; usb_init(); if (usb_find_busses() < 0) return INVALID_DEVICE_INFO; if (usb_find_devices() < 0) return INVALID_DEVICE_INFO; // Initialize the device index we are seaching for uiDevIndex = uiIndex; //uiIndex == 0 for (bus = usb_get_busses(); bus; bus = bus->next) { for (dev = bus->devices; dev; dev = dev->next) { ........ vendorid usw vergleichen.... } }
Nun wird der Bus: mit dirname: "bus-0" gefunden.
Dieser hat aber keine devices!?Und es wird auch kein anderer USB-Bus gefunden und somit steigt die routine hier dann aus!
Kann mir das jemand erklären?
-
schwa226 schrieb:
habe mit C eigentlich nichts am Hut, aber nun habe ich ein Demo-Programm, das mir Probleme bereitet.
Das gehört dann aber auch in das C, nicht das C++ Forum. Zudem scheint es wohl eine spezielle Schnittstelle zu sein - zumindest ist usb_get_busses() mit Sicherheit nicht im C-Standard. Ohne weitere Angaben wird dir wohl kaum einer helfen können.
-
Danke,
aber ist hier doch ein
C/C++ Forum
Forum, oder?
Eine Unterteilung für C habe ich nicht gefunden.
usb_get_busses()
ist definiert in usb.h:struct usb_bus *usb_get_busses(void);
struct usb_bus { struct usb_bus *next, *prev; char dirname[LIBUSB_PATH_MAX]; struct usb_device *devices; unsigned long location; struct usb_device *root_dev; };
-
Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Das sieht mir nach libusb-0.1.x aus.
Also ich hatte da (allerdings unter Linux mit dem gcc) immer den Beispielcode benutzt:usb_init(); usb_find_busses(); usb_find_devices(); for (struct usb_bus *bus = usb_get_busses(); bus; bus = bus->next) { for (struct usb_device *dev = bus->devices; dev; dev = dev->next) { printf("Device %04x:%04x\n", dev->descriptor.idVendor, dev->descriptor.idProduct); /* Wenn vid und pid passen, tu was... */ } }
Wobei dein Code genauso aussieht...
Welche Version von libusb benutzt du denn?
EDIT:
Zumindest in libusb 1.0, was mittlerweile der stabile Zweig ist, gibt eslibusb_open_device_with_vid_pid
, die es etwas leichter macht, ein bestimmtest Gerät zu finden
-
ANSI-C, OK!
Die Version ist LibUSB-Win32 - DLL, 0.1.12.1.
Diese DLL ist dann im \Debug Ordner.
Wenn sie nicht drinnen ist, kommt auch die Meldung libusb0.dll missing!OK... man O man!
Habe nun die "libusb-win32-filter-bin-0.1.12.2.exe" installiert und nun werden Devices gefunden.
Aber nun gibt es hier einen Error:
// Make sure there are 2 endpoints available if (dev->config->interface->altsetting->bNumEndpoints < 2) return pdi;
0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000009
und zwar ist dev->config NULL und somit kann der Wert nicht abgefragt werden.
-
ANSI-C, OK!
Mach dir mal nichts draus. Das sieht aus wie der Windows-Port einer Unix-Library, also hätte es am besten nach Linux/Unix gepasst.
-
Vielen Dank auf jeden Fall!
Ein anderes Programm hat mir anscheinend das USB-Gerät blockiert. Nun habe auch die bNumEndpoints lesen können!
Danke für den Tipp mit LibUSB!