C++ отправляет данные с помощью libusb (работает с RS 232)

Я посылаю 199 151 2 3 3 7 63 173 174 блока в последовательный порт и получил успех. Но когда я делаю это с libusb, ничего не происходит. Нет ошибки или ничего не происходит.

вот как я отправляю данные в последовательный порт (RS 232):

unsigned char data[9];
//filling data
RS232_cputs(comportNumber, &data[0], 9); //success

вот как я отправляю данные на usb

//endPointAdressIn = 2;
//timeout = 0;

for( int i = 0; i < 9; i++ )
{
     libusb_bulk_transfer(deviceHandle, endPointAdressIn , data, 3, &actual, timeout);
}

Есть ли разница в протоколе между USB и RS? Если я отправлю одинаковые серийные данные и USB, я не смогу добиться успеха?

Я нашел что-то подобное:

когда они отправляют данные в последовательный порт, отправляя символ за символом. когда я посылаю его серийно, я тоже так делаю. Но они отправляют на usb одни и те же данные, добавляя по два символа для каждого: для 199 151 2 3 3 7 63 173 174 данных отправляют 2 1 199 2 1 151 2 1 2 2 1 3 2 1 3 2 1 7 2 1 6 2 1 3 2 1 173 2 1 174

Они тоже попробовали так:

transferredData[0]=0x02;
transferredData[1]=0x01;

for( int i = 0; i < 9; i++ )
{
    transferredData[2] = data[i];

    return_value = libusb_bulk_transfer(deviceHandle, endPointAdressIn , transferredData, 3, &actual, 0);        
}

я добавил 2, 1 для каждого моего члена данных, и я отправляю это так. И тоже ничего не случилось. Нет ошибок или ничего в моем оборудовании.

Так что я делаю не так?

2 ответа

Решение

Устройства USB реализуют классы устройств USB в своих прошивках, а устройство с виртуальным COM-портом (последовательный порт USB) реализует класс устройств USB CDC ACM ( https://en.wikipedia.org/wiki/USB_communications_device_class). операционная система загружает драйверы / модули ядра, которые соответствуют классу (ам) устройства, то есть Linux загружает usb-serial для виртуального com-порта исходный код находится по https://elixir.free-electrons.com/linux/v3.5/source/drivers/usb/serial/usb-serial.c

поэтому модуль ядра внутренне использует bulk transfers однако в соответствии с микропрограммой устройства USB-to-serial устройства (класс устройства USB CDC ACM)

USB-устройство не реализует все возможные функции (классы устройств), некоторые реализуют несколько классов устройств ( https://en.wikipedia.org/wiki/USB), в этом случае их можно переключать между функциями через USB-интерфейсы, т.е. Смартфон реализует запоминающие устройства, PTP, MTP, CDC ( RNDIS (модем)),...

когда вы пытаетесь записать массовые передачи через устройство CDC ACM, вы 1. получаете проблемы с драйвером / модулем ядра os, который автоматически загружается (по крайней мере, вы должны его выгрузить) 2. получаете проблемы с прошивкой устройства, потому что ваши массовые передачи должны быть совместимы с прошивкой устройства

Вы можете выбрать конечные точки на устройстве и записать на них массовые передачи, однако, если вы не знаете, что делает прошивка устройства с вашими большими объемами, это не очень разумно, поэтому существуют стандартные классы устройств USB

или, короче говоря, очень трудно разумно использовать голое USB-устройство (голые средства без модуля ядра или, по крайней мере, без знания прошивки устройства)

USB является сложным протоколом ( RS-232 / serial относительно прост), потому что USB очень изменчив, универсален (может подключать все виды устройств: камеры, смартфоны, принтеры, устройства хранения данных, ...), и эта изменчивость приносит сложность

нет USB-устройства без микроконтроллера, на котором установлена ​​прошивка, потому что сложность протокола USB требует этого...

хорошее резюме протокола USB находится в http://www.beyondlogic.org/usbnutshell/usb1.shtml

Когда вы отправляете данные через последовательный порт, они отправляются "как есть" на другое оконечное устройство.

Когда вы отправляете на USB-устройство через libusb_bulk_transfer, ваши данные отправляются на устройство, подключенное к вашему компьютеру. Протоколы взаимодействия с USB-устройствами довольно специфичны. Что устройство делает с полученными данными, зависит от прошивки устройства. Если это что-то стандартное, например, запоминающее устройство, USB-аудио, HID-устройство или USB-последовательный адаптер, эти протоколы указаны в спецификации USB.

Вам не нужен libusb, если вам не нужно напрямую взаимодействовать с подключенным устройством, например, на встроенной платформе или с чем-то неподдерживаемым или если вы разрабатываете такую ​​поддержку. ОС обычно обеспечивает уровень абстракции через определенные модули ядра для взаимодействия с USB-устройствами ввода, хранения или последовательными устройствами.

Другие вопросы по тегам