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 es libusb_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!


Log in to reply