Forum: PC-Programmierung Problem mit usb_bulk_write bei libusb


von G. B. (geri)


Lesenswert?

Hallo

Nach Rat eines Formum-Users hier, diese Problemstellung nochmals in 
einem neuen Thread:

Ich verwende libusb mit Delphi und habe ein Problem mit usb_bulk_write. 
Es werden einfach keine Bulkdaten verschickt. Ich habe auch schon 
ausgiebig recherchiert, fand allerdings keinen hilfreichen Thread..

Mein Code (Delphi) sieht folgendermassen aus...:
  bus := usb_get_busses; // Return the list of USB busses found

  Writeln('bus/device  idVendor/idProduct');
  while Assigned(bus) do
    begin
      dev := bus^.devices;
      while Assigned(dev) do
        begin
          writeln(bus^.dirname, '/', dev^.filename,
                  '     ',
                  '0x' + IntToHex(dev^.descriptor.idVendor, 4),
                  '/',
                  '0x' + IntToHex(dev^.descriptor.idProduct, 4));


          udev := usb_open(dev);
          if Assigned(udev) then
            begin
              if dev^.descriptor.iManufacturer > 0 then
                begin
                  ret := usb_get_string_simple(udev, 
dev^.descriptor.iManufacturer, S, sizeof(S));
                  if (ret > 0) then
                    begin
                      writeln('- Manufacturer : ', S);
                     if (S[0] = 'W') and (s[1] = 'e') then
                      Begin
                       len:=4;
                       TransResult:=usb_bulk_write(udev,myEndPoint,cmdBuf,len,0);

...snipp
...
...


Transresult liefert mir den Wert -22. Wenn ich in einem USB-Monitor den
Datentransfer beobachte, dann sehe ich auch, dass keine Bulk-Daten
geschickt werden. Habt ihr vielleicht eine Idee?

Der Manufacturer-String wird allerdings richtig ausgegeben.


Wenn ich debugging einschalte, dann erhalte ich nach dem Aufruf von 
usb_bulk_write die Meldung:
LIBUSB_DLL: error: usb_submit_async: invalid configuration 0

Habt ihr vielleicht eine Idee?

Vielen Dank für eure Tipps

Geri

von Ampfing (Gast)


Lesenswert?

Hi,

kann zwar kein Delphi, habe aber glaube ich Deinen Fehler gefunden.
Du musst vor dem bulk write die Funktion usb_claim_interface rufen.

Viele Grüße

von G. B. (geri)


Lesenswert?

Hallo Ampfing

Hattest recht, nach einem genauen Vergleich eines C-Beispiels mit meinem 
Beispiel habe ich es auch bemerkt.

Jedenfalls vielen Dank für Deinen wichtigen Hinweis und freundliche 
Grüsse!

Geri

von DerDan (Gast)


Lesenswert?

Hallo,

wie bindest du denn die libusb in Delphi ein?


mfg

DerDan

von adx (Gast)


Lesenswert?

Ich habe auch ein Problem mit usb_bulk_write. Ich bekomme von 
usb_strerror immer die Meldung: "usb_submit_async: submitting request 
failed, win error
: Falscher Parameter.". Das passiert sowohl bei bulk_write als auch bei 
bulk_read. An der Geräte-Software kann es auch kaum liegen (habe zum 
Test auch mal mal die Firmware von usbasp darauf geflasht, selbes 
Ergebnis). Control-Transfers funktionieren aber einwandfrei. So langsam 
weiß ich nicht mehr woran es noch liegen könnte.
Hier mein Code (die Funktion open_dev() ist hier nicht dabei, die 
funktioniert aber ohne Probleme). Bis einschließlich usb_claim_interface 
geht es einwandfrei, nur die Bulk-Transfers machen den Ärger:

#define BUF_SIZE 64
usb_dev_handle *dev = NULL; /* the device handle */
char tmp[BUF_SIZE];

if(!(dev = open_dev()))
    {
      printf("error: device not found!\n");
      return 0;
    }

  if(usb_set_configuration(dev, 1) < 0)
    {
      printf("error: setting config 1 failed\n");
      usb_close(dev);
      return 0;
    }

  if(usb_claim_interface(dev, 0) < 0)
    {
      printf("error: claiming interface 0 failed\n");
      usb_close(dev);
      return 0;
    }
  if(usb_bulk_write(dev, EP_OUT, tmp, sizeof(tmp), 5000) != sizeof(tmp))
    {
    printf("error: bulk write failed: %s\n", usb_strerror());
    }

  if(usb_bulk_read(dev, EP_IN, tmp, sizeof(tmp), 5000)
     != sizeof(tmp))
    {
    printf("error: bulk read failed: %s\n", usb_strerror());
    }

von Christian R. (supachris)


Lesenswert?

Ist denn auch sichergestellt, dass der USB Chip Daten hat, wenn du die 
lesen willst bzw. genügend freien Puffer, wenn du welche schreiben 
willst? Oder versuchst du mit einer nicht von dir entwickelten USB 
Hardware zu kommunizieren?

von adx (Gast)


Lesenswert?

Wenn der Chip keine Daten oder keinen freien Puffer hätte, würde doch 
eher nicht die Meldung "Falscher Parameter" kommen, oder? Die 
USB-Hardware ist selbst entwickelt, mit dem AVR-USB-Treiber von 
obdev.at.

von Carsten (Gast)


Lesenswert?

Hallo,

ich wärme ja ungern alte Threads auf, aber die Frage, wie man libusb in 
Delphi einbindet, ist leider immer noch offen. :-(

Gruß, Carsten

von Mehmet K. (mkmk)


Angehängte Dateien:

Lesenswert?

@Carsten

http://svn.chrilly.net/uc-tech/PWM-USB/
Habe den Inhalt dieser Seite als Anhang beigelegt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.