mikrocontroller.net

Forum: PC-Programmierung Problem mit usb_bulk_write bei libusb


Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: G. B. (geri)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: DerDan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie bindest du denn die libusb in Delphi ein?


mfg

DerDan

Autor: adx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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());
    }

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: adx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mehmet Kendi (mkmk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Carsten

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.