21. januar 2012 - 11:49Der er
17 kommentarer og 1 løsning
Hjælp til libusb_interrupt_transfer (debian)
Jeg forsøger at rette noget kode, så det understøtter min USB vægt. Jeg har taget udgangspunkt i https://github.com/erjiang/usbscale Vægten er en Dymo M10
Koden registrerer at der er en vægt, men giver fejlen: libusb:error [submit_bulk_transfer] submiturb failed error -1 errno=22
Jeg har afgrænset problemet, til denne kodestump:
r = libusb_interrupt_transfer( handle, LIBUSB_ENDPOINT_IN | LIBUSB_REQUEST_TYPE_CLASS, data, WEIGH_REPORT_SIZE, // length of data &len, 10000 //timeout => 10 sec );
Umiddelbart gætter jeg at r burde være 0 (som er succes-retur-værdi for andre libusb funktioner) men:
...i dette eksempel trykker jeg hårdere og hårdere på vægten. De enkelte bytes passer med brugen i koden. De 2 sidste bytes er vægten. (eks. sidste linjes "38 18" - konverterer man "1838" til et tal, får man "6200" som var vægten der stod, da jeg trykkede hårdest.
Jeg vil dog helst bruge libusb, til at trække dataene ud. Nogen der kan hjælpe med det?
endpoint er en slags magi, du skal vide hvad den er før du kan tale med den!
Du kan muligvis se endpoints med lsusb -v
I linket du gav med bruger de [code] r = libusb_interrupt_transfer( handle, //bmRequestType => direction: in, type: class, // recipient: interface LIBUSB_ENDPOINT_IN | //LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, data, WEIGH_REPORT_SIZE, // length of data &len, 10000 //timeout => 10 sec ); [/code]
LIBUSB_RECIPIENT_INTERFACE istedet for LIBUSB_REQUEST_TYPE_CLASS måske er det løsningen, men igen fejlmelding skal lige fortolkes for at kunne komme videre.
int libusb_interrupt_transfer (struct libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout);
unsigned char *
ffffff ser du kun hvis du konverterer til int/long (32-bit)
Type konvertering under C/C++ er meget interessant.
Når du har en signed char 0x8c og konverterer den til signed int (32 bit) så ser int'en den højeste bit som fortegns bit og så får du din it til at se sådan ud, da 0x8c som signed er et negativt tal og så fortegns bitten forlænges til 0xffffff8c, hvis du vil vide mere så skal du læse om 1's komplement.
Hvis du deler din double weight = (double)(dat[4] + (dat[5] << 8)) / 10; lidt op så kan du bedre se det.
Du kan signed char dat[8]; // prøv bagefter med unsigned dat[4] = 0x8c; int tal = dat[4];
int libusb_interrupt_transfer (struct libusb_device_handle *dev_handle, unsigned char endpoint, unsigned char *data, int length, int *transferred, unsigned int timeout);
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.