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-устройствами ввода, хранения или последовательными устройствами.