C++ 使用 libusb 发送数据(使用 RS 232)

C++ send data with libusb (working with 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,然后我就这样发送了。而且也什么都没发生。我的硬件没有错误或什么都没有。

那我做错了什么?

当你通过串口发送数据时,它发送"as is"到其他终端设备。

当您通过 libusb_bulk_transfer 发送到 USB 设备时,您的数据就是发送到连接到您计算机的设备的数据。与 USB 设备交互的协议非常具体。设备对接收到的数据做什么取决于设备的固件。如果是标准的东西,比如大容量存储、USB 音频、HID 设备或 USB 串行适配器,这些协议在 USB 规范中。

除非你必须直接与连接的设备交互,否则你不需要 libusb,例如在嵌入式平台上或不受支持的东西上,或者如果您正在开发此类支持。 OS 通常通过特定的内核模块提供抽象层,以与 USB 连接的输入、存储或串行设备进行交互。

USB 设备在其 固件 中实现 USB 设备 classes 一个虚拟 COM 端口(USB 串行)设备实现 USB CDC ACM 设备 class ( https://en.wikipedia.org/wiki/USB_communications_device_class ) . the operating system loads drivers / kernel modules that fit the device class(es), i.e. linux loads usb-serial for a virtual com port, the source code is in https://elixir.free-electrons.com/linux/v3.5/source/drivers/usb/serial/usb-serial.c

因此内核模块在内部使用 bulk transfers,但其方式 与 USB 转串口设备(USB CDC ACM 设备)的设备固件 兼容class )

一个 USB 设备不实现所有 possible 功能(设备 classes),一些实现多个设备 classes(https://en.wikipedia.org/wiki/USB#Device_classes),在此外壳可以通过 USB 接口在功能之间切换,即智能手机实现大容量存储、PTP、MTP、CDC(RNDIS(网络共享)),...

当您尝试通过 CDC ACM 设备写入批量传输时,您 1. 遇到自动加载的 os 驱动程序/内核模块的问题(您有至少卸载它)2. 设备固件出现问题,因为您的批量传输必须与设备固件兼容

您可以在设备上选择ose 端点并将批量传输写入它们,但是如果您不知道设备固件对您的批量传输做了什么,这不是很合理,这就是标准化的原因USB 设备 class 存在

或者简而言之,合理使用裸USB设备是非常困难的(裸意味着没有内核模块,或者至少不了解设备固件)

USB 是一个复杂的协议(RS-232 / 串口相对容易)因为 USB 非常多变、通用(可以连接各种设备:相机、智能手机、打印机、大容量存储...)可变性带来复杂性

没有没有微控制器的 USB 设备 运行 上面有固件,因为 USB 协议的复杂性需要这个 ...

USB 协议的一个很好的总结在http://www.beyondlogic.org/usbnutshell/usb1.shtml