Forum: PC-Programmierung libusb ausstehende bulktransfers beenden, aber wie?


von Tastkopf (Gast)


Lesenswert?

Mahlzeit

Ich hab leider nochmal ein Problem bei dem mir die libusb und libusbJava 
doku nicht weiterhilft.
Wenn ich LibusbJava1.libusb_close(usbHandle); aufrufe, während noch 
bulktransfers ausstehen, werden die ausstehenden transfers nicht 
beendet, bulktransfers mit timeout blockieren sogar dauerhaft, anstatt 
eine Timeout exception zurückzugeben.
Auf welche Weise beende ich einen bulktransfer wenn das Device (aus 
welchen Gründen auch immer) die Daten des transfers nicht empfängt oder 
sendet?
Hier mal ein vereinfachter Codeausschnitt  um mein Problem zu 
veranschaulichten:
1
if (usbHandle = device.open()) 
2
      {
3
        Thread t = new Thread() 
4
        {
5
          public void run() 
6
          {
7
            try
8
            {
9
              int length = 4;
10
              byte[] data = new byte[5];
11
              LibusbJava1.libusb_bulk_transfer(usbHandle, (byte) 0x1, data , length , 0);
12
            } catch (Exception e) {
13
              e.printStackTrace();
14
            }
15
          };
16
        };
17
        t.start();
18
        threadVector.add(t);
19
      }
20
      try {
21
        Thread.sleep(2000);
22
      } catch (InterruptedException e) {
23
        // TODO Auto-generated catch block
24
        e.printStackTrace();
25
      }
26
      LibusbJava1.libusb_close(usbHandle);
27
      EfmUsbService.exit();
Viele Grüsse
Chris

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Schuss ins Blaue: da es sich ja offenbar um eine Fehlersituation
handelt, hast du mal einen device reset probiert?

von Tastkopf (Gast)


Lesenswert?

Problem hat sich quasi erledigt, ausser das ich noch nicht ganz sicher 
bin wie mein Workaround aussehn wird.
http://sourceforge.net/mailarchive/forum.php?thread_name=20120726142729.8498.qmail%40stuge.se&forum_name=libusb-devel
leider ist die Antwort nicht sehr zufriedenstellend.
"The C library does not cancel transfers when libusb_close() is called, 
and on the other hand libusb_close() does not wait until all transfers 
have been completed but closes the device immediately - so the transfers 
will never complete. The application has to clean up all transfers 
before calling libusb_close().
When using the synchronous API there's no way to cancel a transfer."


@Jörg Wunsch
dank für den Hinweis, ich werde mal testen was passiert, aber da die 
close funktion keine ausstehnden Transfers beendet, bezweifel ich dass 
die reset funktion dies macht. Wir werden sehn

von Tastkopf (Gast)


Lesenswert?

Tastkopf schrieb:
> @Jörg Wunsch
> dank für den Hinweis, ich werde mal testen was passiert, aber da die
> close funktion keine ausstehnden Transfers beendet, bezweifel ich dass
> die reset funktion dies macht. Wir werden sehn

Scheint zu funktionieren, ist allerdings nur als workaround in erwägung 
zu ziehen wenn man weis was da passiert.

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.