LINUX.ORG.RU

Странности работы с /dev/hidraw

 ,


0

1

Всем привет. Кто-нибудь сталкивался с такой проблемой, что когда отправляешь пакет данных в /dev/hidraw* в N байт (т. е. столько, сколько указано в Endpoint Descriptor, значение wMaxPacketSize), а потом смотришь в Wireshark, там почему-то только N-1 байт передано.

Так оно в Linux, под Windows же всё работает прекрасно. Использовал библиотеку hidapi.

Пробовал также для приёма и передачи данных использовать обычные функции read, write из unistd.h, но проблема не устранилась.

Вот какие дескрипторы показывает lsusb, если это поможет:

 Endpoint Descriptor:
   bLength                 7
   bDescriptorType         5
   bEndpointAddress     0x81  EP 1 IN
   bmAttributes            3
     Transfer Type            Interrupt
     Synch Type               None
     Usage Type               Data
   wMaxPacketSize     0x0040  1x 64 bytes
   bInterval               1
 Endpoint Descriptor:
   bLength                 7
   bDescriptorType         5
   bEndpointAddress     0x02  EP 2 OUT
   bmAttributes            3
     Transfer Type            Interrupt
     Synch Type               None
     Usage Type               Data
   wMaxPacketSize     0x0040  1x 64 bytes
   bInterval               1


Собственно, эта проблема проявляется в том, что устройство не реагирует на данные, которые я посылаю. Что характерно, не всегда. Только когда устройство находится в определенном состоянии. В любом случае, одна и та же программа под виндой работает, под линуксом (перекомпилированная, конечно) - нет.

eve ()
Последнее исправление: eve (всего исправлений: 2)

OMG, нашел причину. Я слегка обманул вас, когда сказал, что версии программы для windows и linux идентичны. На самом деле, в сборке под Linux я проигнорировал этот момент:

The first byte of the buffer passed to write() should be set to the report number. If the device does not use numbered reports, the first byte should be set to 0. The report data itself should begin at the second byte.

(отсюда: https://www.kernel.org/doc/html/latest/hid/hidraw.html)

Но все равно некоторые команды устройство воспринимало корректно. Любопытно-с.

eve ()