Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 20.02.2022
Сообщений: 55

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

11.04.2024, 07:30. Показов 2768. Ответов 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
667 / 840 / 102
Регистрация: 23.11.2021
Сообщений: 4,893
Записей в блоге: 15
11.04.2024, 07:48
Так он же CDC - должен появляться как эмулятор последовательного порта. Т.е. libusb здесь совсем не нужна.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
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
11556 / 4351 / 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,907
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
667 / 840 / 102
Регистрация: 23.11.2021
Сообщений: 4,893
Записей в блоге: 15
12.04.2024, 09:43
Цитата Сообщение от Vlad_V9 Посмотреть сообщение
распарсить протокол
Если этого нет в документации, то придется долго и мучительно анализировать выхлоп wireshark, пользуясь оригинальной софтиной под маздаем. Под более простые железки я именно так и писал линуксовый софт. Вечная беда проприетастов: ни схемы тебе, ни подробной документации, я уж молчу о вменяемом SDK.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,907
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
667 / 840 / 102
Регистрация: 23.11.2021
Сообщений: 4,893
Записей в блоге: 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,907
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru