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

C++ send data with libusb (working with RS 232)

本文关键字:使用 RS libusb C++ 数据      更新时间:2023-10-16

我正在向串行端口发送 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,然后像这样发送。也什么也没发生。我的硬件中没有错误或什么都没有。

那么我做错了什么?

USB设备在其固件中实现USB设备类虚拟COM端口(USB串行)设备实现USB CDC设备类(https://en.wikipedia.org/wiki/USB_communications_device_class)。 操作系统加载适合设备类的驱动程序/内核模块,即Linux加载虚拟COM端口usb-serial,源代码是 https://elixir.free-electrons.com/linux/v3.5/source/drivers/usb/serial/usb-serial.c

因此内核模块在内部使用bulk transfers,但以符合USB转串行设备(USB CDC ACM设备类)的设备固件的方式使用

。USB设备没有实现所有可能的功能(设备类),有些实现了多个设备类(https://en.wikipedia.org/wiki/USB#Device_classes),在这种情况下可以通过USB接口在功能之间切换,即智能手机实现大容量存储,PTP,MTP,CDC(RNDIS(网络共享)),...

当您尝试通过 CDC ACM 设备写入批量传输时,您1. 自动加载的操作系统驱动程序/内核模块出现问题(您至少必须卸载它)2.设备固件出现问题,因为批量传输必须符合设备固件

您可以在设备上选择端点并向其写入批量传输,但是如果您不知道设备固件对批量 trnasfers 的作用,这不是很合理,这就是标准化 USB 设备类存在的原因

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

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

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

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

当您通过串行发送数据时,它会"按原样"发送到其他终端设备。

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

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