libusb-win32_wolnodziała

Odpowiedz Nowy wątek
S1101
2007-03-26 12:08
S1101
0

Witam.
libusb-win32 jest biloteką dll do obsługi urządzeń usb.
Muszę napisać program który z pewnego czytnika odczyta mi dane (75kb). Odczyt jest dokonywany za pomocą funkcji zawartej w ww. dll. Ze względu na jego działanie musze odczytywać po 64 bajty (1200 operacji odczytu).
Wszystko działa, poza drobnym szczegółem. Cała operacja zajmuje u mnie ponad 8 sekund, a mam demo programu korzystającego z tej biblioteki, który robi to poniżej sekundy. Bibliotekę dołączam statycznie na początku, odczyt mam w pętli "for". korzystam z DevC++. Może ktoś poradzi jak to przyśpieszyć..w razie czego wrzucę za chwil mój kod.
Pozdrawiam i z góry dziękuję za ewentualną pomoc.

Pozostało 580 znaków

2007-03-26 12:45

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0

moze wykonujesz to synchronicznie zamiast operacji asynchronicznych - bez oprozniania buforow zapisu ?


Linuksa, czy innego Uniksa, można opisać za pomocą logiki boolowskiej a nie za pomocą prawdopodobieństwa.

'System szesnastkowy jest wspaniały! W skali od 1 do 10 daję mu E'

extreme safety for Ubuntu:
sudo echo -e 'Defaults targetpw\nDefaults timestamp_timeout=0' >> /etc/sudoers

Pozostało 580 znaków

s1101
2007-03-26 18:26
s1101
0

tak ale wszystkie funkcje w tej bibliotece są synchroniczne..

to jest moja funkcja odczytu:

int finescan_getimg(void)
{

    char sbuff[64];
    char *p_sbuff;
    int res,i,j;

     p_sbuff=sbuff;

     res=usb_control_msg(udevhandle,64,0xc2,0x0208,0,0,0,1000);//02

     i=0;
     res=64;
     res=usb_control_msg(udevhandle,192,0xc3,0x0008,0,0,0,1000);

     for (i=0;i<1200;i++)
     {
           res = usb_bulk_read(udevhandle,0x81, p_sbuff, 64, 100); 

           for (j=0;j<64;j++)
           {
                      imgBuffer[i*64+j]=p_sbuff[j]; 
           }
     }

     res=usb_control_msg(udevhandle,64,0xc2,0x0008,0,0,0,1000);

return 1;
}

// kod źródłowy bierz w tag odpowiedni, a nie powiększaj mu czcionkę - m.Q

Pozostało 580 znaków

2007-03-26 19:51

Rejestracja: 16 lat temu

Ostatnio: 9 lat temu

0

Czemu czytasz do jakiegoś bufora pomocniczego? W dodatku potem przepisujesz po bajcie dane...
Ten kod powinien działać szybciej.

int finescan_getimg(void)
{

    int res,i;

     res=usb_control_msg(udevhandle,64,0xc2,0x0208,0,0,0,1000);//02

     i=0;
     res=64;
     res=usb_control_msg(udevhandle,192,0xc3,0x0008,0,0,0,1000);

     for (i=0;i<1200;i++)
     {
           res = usb_bulk_read(udevhandle,0x81, (char*)&imgBuffer[i*64], 64, 100); 
     }

     res=usb_control_msg(udevhandle,64,0xc2,0x0008,0,0,0,1000);

return 1;
}

JKM czy HGW?

Pozostało 580 znaków

s1101
2007-03-27 01:30
s1101
0

Może nie komentujmy moich "kwiatków"...;)) szkoda na nie słów..no chyba że pośmiać sie:) ... douczę sie
A w tym wypadku raczej nie mają one większego znaczenia, ale mimo to dzięki za korektę!!
Chodzi oto ze sama funkcja usb_bulk_read wywołuje się bardzo wolno (te 8 sekund na całość, które na początku napisałem na normalnym komputerze są 2-3 ...ale to i tak za długo ). No i nie wiem czy chodzi o czas dostępu do niej (raczej nie) , czy po prostu ta biblioteka tak ma (wszystkie funkcje wykonywane są w niej synchronicznie) a jeśli tak to rzucić nią w kat i brać się za WinAPI?? ale z <ort>drógiej</ort> strony to demko które mam korzysta z tej biblioteki (a przynajmniej udaje) i chodzi dobrze...
Pozdrawiam

Pozostało 580 znaków

2007-03-27 12:35

Rejestracja: 14 lat temu

Ostatnio: 11 godzin temu

0

Drobna modyfikacja:

for (i=0;i<1200;i++)
{
    res = usb_bulk_read(udevhandle,0x81, (char*)&imgBuffer[i*64], 64, 100); 
    if(res<0)break;
}

Pozostało 580 znaków

s1101
2007-03-27 14:58
s1101
0

Wiem.. jest jeszcze parę innych szczegółów, aby to było w pełni poprawne.... ale to nie zmienia faktu że 1200. krotne wywołanie tej funkcji trwa o wiele za długo. Potrzebuje pomysłu jak to realnie przyśpieszyć...albo innego rozwiązanie.

Pozostało 580 znaków

2007-03-27 16:14

Rejestracja: 16 lat temu

Ostatnio: 9 lat temu

0

Jesteś pewien, że odczyt musi być w tak małych porcjach? Może obadaj debuggerem to demo?


JKM czy HGW?

Pozostało 580 znaków

2007-03-27 18:25

Rejestracja: 13 lat temu

Ostatnio: 12 lat temu

0

No niestety tak, próbowałem czytać większe to mi ładnie duplikuje pierwsze 64 bajty. No chyba że producent jeszcze coś ukrywa.... (nie napisał np w nocie katalogowej Vendorcode'ów które trzeba wysłać żeby mu jaką kolwiek konfigurację zrobić)
a co do debugera ... to spróbuje zobaczyć

Pozostało 580 znaków

2007-03-28 15:45

Rejestracja: 16 lat temu

Ostatnio: 7 lat temu

0
0x666 napisał(a)

Drobna modyfikacja:

I jeszcze 2 drobniejsze:

i=0;
do{
  res = usb_bulk_read(udevhandle,0x81, imgBuffer+(i<<6), 64, 100); 
}while(++i<1200 && res>=0)  // (!(res<0)) popraw, ja tylko przepisalem, zeby pasowalo

albo wlasciwie:

i=0;
while((res=usb_bulk_read(udevhandle,0x81,imgBuffer+(i<<6),64,100))>=0 && ++i<1200);

Linuksa, czy innego Uniksa, można opisać za pomocą logiki boolowskiej a nie za pomocą prawdopodobieństwa.

'System szesnastkowy jest wspaniały! W skali od 1 do 10 daję mu E'

extreme safety for Ubuntu:
sudo echo -e 'Defaults targetpw\nDefaults timestamp_timeout=0' >> /etc/sudoers

Pozostało 580 znaków

2007-03-29 11:32

Rejestracja: 13 lat temu

Ostatnio: 12 lat temu

0

Cofam to co wcześniej napisałem. Wbrew temu co jest napisane w dokumentacji dla tej biblioteki jednak są jakieś funkcje asynchroniczne.
Problem z użyciem ma taki że jednym z parametrów jest void * context , lub void context czyli referencje do jakeś zmiennej dowolnego typu. Podejrzewam że ma to być jakaś struktura ... ale nic na jej temat nie widze

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0