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,然后像这样发送。也什么也没发生。我的硬件中没有错误或什么都没有。
那么我做错了什么?
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连接的输入,存储或串行设备进行交互。
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用strcpy将char数组的元素复制到另一个数组
- 在c++中使用nlohmann从类到json的转换
- C++使用 libusb 发送数据(使用 RS 232)
- 在.rs资源文件c++控制台中使用参数