Programatore amatore

Uwielbiam fantastycznie udokumentowane i rozsądnie działające biblioteki. Jest taka fajna, libusb, która w zasadzie eliminuje konieczność modyfikowania jądra przy dodawaniu obsługi nowych urządzeń. Poza różnymi innymi funkcjami są odpowiedniki read() i write(): usb_bulk_read(), usb_bulk_write().

Sporo czasu w ciągu ostatnich dni spędziłem śledząc błąd w gnokii, który w uproszczeniu polegał na tym, że gubiły się dane w transmisji. Miałem bufor wielkości 255 bajtów i gdy odpowiedź od telefonu przekraczała te 255 bajtów, zawsze 64 bajty ze środka znikały.

Co się okazało? Telefon przesyła dane w paczkach po 64 bajty (to nawet widać w wynikach lsusb). Telefon zwraca dane w paczkach o wielkości będącej wielokrotnością 64 bajtów (a więc …, 192, 256, …) oprócz ostatniej oczywiście. Jeśli bufor jest mniejszy niż zwrócona paczka, to dane są obcinane do największej wielokrotności 64 mniejszej niż wielkość bufora (dokładniej: nie dane tylko wynik funkcji mówiący ile bajtów przeczytano). Co się dzieje z pozostałymi danymi? Nic. Nie trafia nawet informacja do loga o tym że coś się gubi.

I love this game…

Reklamy

2 responses to “Programatore amatore

Skomentuj

Proszę zalogować się jedną z tych metod aby dodawać swoje komentarze:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s