0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55

Чтение с USB устройства

11.04.2024, 07:30. Показов 2840. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Осваиваю работу с USB устройствами. При попытке чтения записи с осциллографа выдает: LIBUSB_ERROR_IO.
Функция чтения.
C++ (Qt)
1
2
3
4
5
6
ret = libusb_interrupt_transfer (dev_handle, 0x02, cmd, 512,&Transfer, 200);//sizeof (cmd)
    if (ret == 0 && Transfer == sizeof (cmd)) {
        printf ("Запись прошла успешно");
    } else {
        printf ("Ошибка записи  %d! :", ret);printf (libusb_error_name(ret));printf ("\n");
    }
Подноготная осциллографа:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Bus 003 Device 003: ID 049f:505a Compaq Computer Corp. Linux-USB "CDC Subset" Device, or Itsy (experimental)
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x049f Compaq Computer Corp.
  idProduct          0x505a Linux-USB "CDC Subset" Device, or Itsy (experimental)
  bcdDevice           24.30
  iManufacturer           1 Linux 3.2.35 with s3c-hsudc
  iProduct                2 Gadget Serial v2.4
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0020
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          3 
    bmAttributes         0xc0
      Self Powered
    MaxPower                2mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Попробовал считать с USB клавиатуры по 81 конечной точке получилось по 82 такая же ошибка.
Клавиатура:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Bus 003 Device 002: ID c0f4:01b0 USB usb keyboard
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0xc0f4 
  idProduct          0x01b0 
  bcdDevice            1.10
  iManufacturer           1 USB
  iProduct                2 usb keyboard
  iSerial                 0 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x003b
    bNumInterfaces          2
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      1 Boot Interface Subclass
      bInterfaceProtocol      1 Keyboard
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      54
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.10
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      50
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              10
Предполагаю что я что-то не донастроил.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
int main () {
    int i = 0;
    int ret = 1;
    int Transfer = 0;
    ssize_t cnt;
    unsigned char cmd [64] = {0x5A, 0x00, 0x01, 0x02, 0x10, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0xF4, 0x87}; // 64 第 上述 第 3 获取 获取 到 的 缓冲区 大小
 
    struct libusb_device_descriptor desc;
    libusb_device ** devs;
 
    libusb_context * ctx = NULL;
 
    ret = libusb_init (NULL);
    if (ret <0) {
        fprintf (stderr, "не удалось инициализировать libusb \ n");
        return 1;
    }
 
    dev_handle = libusb_open_device_with_vid_pid (NULL, 0x049F, 0x505A);
    if (dev_handle == NULL) {
        perror ("Невозможно открыть устройство \n");
        return 1;
    } else {
        printf ("Устройство открыто \n");
    }
 
    if (libusb_kernel_driver_active (dev_handle, 0) == 1) {
        printf ("Активный драйвер ядра \n");
        if (libusb_detach_kernel_driver (dev_handle, 0) == 0) {
            printf ("драйвер ядра отключен! \n");
        }
    }
 
    ret =libusb_set_configuration(dev_handle, 1);
    if (ret <0) {
        perror ("Cannot configuration Interface \n");
        return 1;
    }
 
    ret = libusb_claim_interface (dev_handle, 0);
    if (ret <0) {
        perror ("Cannot Claim Interface \n");
        return 1;
    }
 
    ret = libusb_interrupt_transfer (dev_handle, 0x02, cmd, 512,&Transfer, 200);//sizeof (cmd)
    if (ret == 0 && Transfer == sizeof (cmd)) {
        printf ("Запись прошла успешно");
    } else {
        printf ("Ошибка записи  %d! :", ret);printf (libusb_error_name(ret));printf ("\n");
    }
 
    char buf [1024] = {0};
    ret = libusb_interrupt_transfer (dev_handle, 0x81, buf, 512, &Transfer, 2000);  //sizeof (buf)
    if (ret != 0) {
        printf ("не удалось прочитать %d   ",ret);printf (libusb_error_name(ret));printf ("\n");
 
    }else{
       printf ("Прилетело %d %d \n",ret,Transfer);
       printf("%d", buf[0]);
    }
 
    ret = libusb_release_interface (dev_handle, 0);
    if (ret != 0) {
        printf ("Невозможно закрыть интерфейс!  ");
    } else {
        printf ("Закрыт интерфейс! \n");
    }
    libusb_close (dev_handle);
    libusb_exit (ctx);
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.04.2024, 07:30
Ответы с готовыми решениями:

Чтение данных от устройства usb
Подскажите, может у кого есть простенькая программа на С для передачи и чтения из usb устройства в качестве примера?

Чтение/запись на устройства
Программа отправки ussd-команд(написанная мной) выглядит так: #include &lt;stdio.h&gt; #include &lt;unistd.h&gt; #include &lt;string.h&gt; ...

Usbmon и мониторинг драйвера usb-устройства
Здравствуйте! Подскажите, пожалуста, как используя usbmon я могу узнать какое usb-устройство обрабатывается каким драйвером?

22
Windows must die
670 / 847 / 102
Регистрация: 23.11.2021
Сообщений: 4,926
Записей в блоге: 15
11.04.2024, 07:48
Так он же CDC - должен появляться как эмулятор последовательного порта. Т.е. libusb здесь совсем не нужна.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
11.04.2024, 08:08
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
idProduct 0x505a Linux-USB "CDC Subset" Device, or Itsy (experimental)
Если он и правда CDC (вообще-то, учитывая bInterfaceClass 255 Vendor Specific Class уверенности нет, но предположим добросовестность производителя), то должен отображаться как /dev/tty??? Проверьте есть ли у вас права на него.
В принципе, для теста можете просто запустить свою программу от рута - у него-то точно права есть.
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
При попытке чтения записи с осциллографа выдает: LIBUSB_ERROR_IO.
...
C
1
2
3
perror ("Невозможно открыть устройство \n");
 printf ("Активный драйвер ядра \n");
 printf ("драйвер ядра отключен! \n");
Покажите полный лог ругани
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
11.04.2024, 11:00
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
ret = libusb_interrupt_transfer (dev_handle, 0x02, cmd, 512,&Transfer, 200);//sizeof (cmd)
Так. Вы пытаетесь передать 512 байт при наличии всего 64 (sizeof(cmd) == 64)
Вас это не смущает?
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
11.04.2024, 12:32  [ТС]

Приложение запускал от root.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
11.04.2024, 12:36  [ТС]
Так. Вы пытаетесь передать 512 байт при наличии всего 64 (sizeof(cmd) == 64)
Вас это не смущает?
Не очень запись я недавно раскоментировал. Подправил размер буфера пациенту легче не стало. Пока цель чтение. По логике CDC не CDC через libusb все равно должен быть обмен.
0
Почетный модератор
 Аватар для Humanoid
11557 / 4352 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
12.04.2024, 00:28
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Функция чтения.
Может, я что-то не понял... но для EP2 тип указан как Bulk, а вы используете libusb_interrupt_transfer. Наверное, вам надо использовать функцию libusb_bulk_transfer.

Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Попробовал считать с USB клавиатуры по 81 конечной точке получилось по 82 такая же ошибка.
Там 82 endpoint на другом интерфейсе. Вы не забыли изменить вызов libusb_claim_interface?
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 06:32  [ТС]
Там 82 endpoint на другом интерфейсе. Вы не забыли изменить вызов libusb_claim_interface?
Да забыл. Спасибо.
Может, я что-то не понял... но для EP2 тип указан как Bulk, а вы используете libusb_interrupt_transfer. Наверное, вам надо использовать функцию libusb_bulk_transfer.
Да скорее всего.

Добавлено через 56 минут
Может, я что-то не понял... но для EP2 тип указан как Bulk, а вы используете libusb_interrupt_transfer. Наверное, вам надо использовать функцию libusb_bulk_transfer.
Помогло. Спасибо.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
12.04.2024, 09:03
Но лучше бы все же работать с устройством так, как предполагалось. Если уж оно эмулирует COM-порт, так с COM-портом.
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 09:35  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но лучше бы все же работать с устройством так, как предполагалось. Если уж оно эмулирует COM-порт, так с COM-портом.
Согласен, и проще. Это устройство осциллограф, у которого свой драйвер и своя утилита для работы с ним. Все это под Windows. И драйвер совсем не похож на com-порт, о том что это com-порт я узнал здесь на форуме. Задача распарсить протокол и вычитывать данные.
0
Windows must die
670 / 847 / 102
Регистрация: 23.11.2021
Сообщений: 4,926
Записей в блоге: 15
12.04.2024, 09:43
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
распарсить протокол
Если этого нет в документации, то придется долго и мучительно анализировать выхлоп wireshark, пользуясь оригинальной софтиной под маздаем. Под более простые железки я именно так и писал линуксовый софт. Вечная беда проприетастов: ни схемы тебе, ни подробной документации, я уж молчу о вменяемом SDK.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
12.04.2024, 09:48
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
о том что это com-порт я узнал здесь на форуме.
Это еще предстоит выяснить. Он отображается как /dev/tty*?
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Задача распарсить протокол и вычитывать данные.
Вот с этим удачи. Хотя если вы в lsusb не увидели, что оно, возможно, является COM-портом, как же вы лог wireshark-а анализировать будете
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 21:18  [ТС]
Вот родной драйвер.
Миниатюры
Чтение с USB устройства  
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 21:25  [ТС]
Это же устройство с zadig драйвером.
Миниатюры
Чтение с USB устройства  
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 21:31  [ТС]
При чем как com порт zadig драйвер не отработал.
Миниатюры
Чтение с USB устройства  
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
12.04.2024, 21:37  [ТС]
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Вот с этим удачи. Хотя если вы в lsusb не увидели, что оно, возможно, является COM-портом, как же вы лог wireshark-а анализировать будете
Дорогу осилит идущий.) Главное не останавливайте его, ибо принесете вред. Даже если не осилит, получит хороший опыт. Увидел но ошибка в драйвере zadig скрин выше заставила забыть что это com-порт. Пакеты смотрел с помощью USBlyzer, сейчас кончился демо-срок не могу найти на нее кряк.
0
Windows must die
670 / 847 / 102
Регистрация: 23.11.2021
Сообщений: 4,926
Записей в блоге: 15
12.04.2024, 22:18
Вах, еще и китайщина.. Ну, там уж логики вообще не будет, как и в их языке!
0
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55
13.04.2024, 00:15  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Вах, еще и китайщина.. Ну, там уж логики вообще не будет, как и в их языке!
Нельзя быть таким пессимистом.)) Скорее всего это копия, сделанная китайцами, какой нибудь известной фирмы. Очень сильно удивлюсь если их разработка. Смотрел логи протокола, скорее всего это какой-то известный протокол, если поизучать тему можно его найти думаю. Да и на данный момент это не сильно важно. Данный девайс это лабораторная работа, чтобы "погрузиться в тему". К примеру я всегда считал что производители публикуют протоколы обмена для своего оборудования, не тут-то было. Это похоже одна из самых больших проблем данного проекта. Задача разработать программу чтения данных и управления измерительными приборами (в основном генераторы и осциллографы).
0
 Аватар для Azathtot
754 / 351 / 90
Регистрация: 07.01.2023
Сообщений: 1,451
13.04.2024, 08:13
Цитата Сообщение от Eddy_Em Посмотреть сообщение
как и в их языке!

Не по теме:

вот как раз-то в китайском очень строгая логика, да и правила формирования иероглифов. А вот в мозгах у них, да, в основном Хаос...

0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
13.04.2024, 20:58
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Дорогу осилит идущий.) Главное не останавливайте его
Ни в коем случае! Человек, взявшийся за реверс протокола обмена и желающий написать человеческий драйвер вместо проприетарной кривульки достоин всяческого уважения!
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
К примеру я всегда считал что производители публикуют протоколы обмена для своего оборудования
Какой оптимизм! А уж в отношении китайцев и подавно. Причем, что самое обидное, больше похоже что даже не по злому умыслу, а из-за лени или спешки. Ну а чего - с фирменной кривулькой в строго специфицированном окружении кое-как работает, ну и ладно. А что за пределами их фирмы пользуются чем-то более современным - не их проблема.
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
Смотрел логи протокола, скорее всего это какой-то известный протокол
Ну хотя бы данные там углядеть можно? А то с них станется...
Я тут недавно ковырял протокол бутловдера от ch32v307 (интересный микроконтроллер на risc-v), так в протоколе обмена вообще ничего похожего на данные не передается. Оказалось, что они из за каким-то китайским бесом шифруют. Причем на удивление детским способом (XOR по коду, переданному тут же), так что смысла в этом "шифровании" я не вижу никакого. А еще их фирменный ущербный бутлоадер не позволяет прошивку считать обратно. По крайней мере без извращений...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.04.2024, 20:58
Помогаю со студенческими работами здесь

Написание USB драйверов под различные устройства
Доброе времени суток! Ищу людей которые занимались написанием USB драйверов под различные устройства в OS Linux. Интересует весь процесс и...

Организация записи в базу данных из устройства, подключенного по USB
Здравствуйте! Подскажите, как можно реализовать связку USB - база данных. Задача такая: Есть устройство которое подключено к USB порту...

Прямое чтение блочного устройства без буфера чтения
Добрый день. Имеется usb-storage устройство, на котором 3 блока по 4096 байт. в этих блоках разные данные, и устройство по-разному...

USB устройства
Как можно в С++ перехватить USB устройство, что бы его вначале определяла программа и при этом ОС не выполняла никаких действий(не...

Событие подключения Usb устройства
Подскажите, плиз, есть ли спецальное событие подключение usb устройства. Цель поймать подключение флешки, серийный номер которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru