与USB设备进行通信,使用usb_control_msg函数,向USB设备读取数据或写入数据。
下面是对函数及其参数的解释:
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout)
向USB设备发送一个请求。
函数各参数的含义如下:
dev:USB设备句柄,该参数指定了向哪个USB设备发送请求;
requesttype:请求的类型,说明了是读请求,还是写请求。可以是标准请求、类请求或自定义请求;
request:表示具体请求的值;
value:与请求相关的参数;
index:与请求相关的参数;
bytes:表示在数据阶段时传输的数据;
size:表示在数据阶段时传输的数据量,以字节为单位;
timeout:请求的超时设置,最大值为5000,以毫秒为单位。
你把发过去的unsigned int拆成2个unsinged char,高位那个为0,发过去后然后接受到的两个合并为一个unsigned int。问一下,这是16位的么?我没有弄过这个通讯.我猜测应是端unsigned char型发生了隐式转换,成为了unsinged int(或unsigned short int)型,因此高8位均为0了。接受到的时候,将比特流按8位来解析,于是产生了2个数据,还有一个为0.
你可以尝试传入一个负数(char型的),应该会产生结果很大差异,因为这时候隐式转换将符号位作为值就有问题了。高8位都是1。接受到的数据0就应该会变成255。
(上述都只是我的猜测)具体工作原理不知....
我说下我的解决思路:
unsigned char convertDate[2]
unsigned char mask = 0xFF
unsigned int transportDate // 待传输的数据
convertDate[0] = transportDate &mask // 低位字节
convertDate[1] = (transportDate >>8) &mask // 高位字节
将这个数组的两个字节发送过去,然后在那端进行合并。
接受那边每次接受两个数据进行一次转换
unsinged int receiveDate = 0
receiveDate = rConvertDate[1] &mask // 存储高位
receiveDate <<= 8 // 移动到高位
receiveDate = rConverDate[0] &mask// 存储低位
合并得到的receiveDate就是转换得到的。
然后,你在自己写发送端、接收端数据处理函数对收发数据进行上述的处理。这样转换后显示应该会正常吧。
最后说下:就是传递的参数说了是unsigned 的,别传入负值了,不然转换解析也会有问题。会转换成很大的unsigned int值。
LibUSB-Win32是一个用于Windows *** 作系统(Win98SE、WinME、Win2k和WinXP)上的通用USB设备驱动程序。该驱动程序允许使用者在不写任何一行核心驱动程序代码的情况下,可以访问Windows系统上的任意一个USB设备。该驱动程序具特点:能够与任意一个已安装的USB设备进行通信
可被用作自己开发的USB设备的驱动程序
支持批量和中断传输
支持USB规范中定义的所有标准设备请求
支持USB设备制造商的自定义请求
通过使用七个函数,就可以与USB设备进行简单通信了,通信的主要流程可分为以下四步:
1) 调用usb_init函数,进行初始化。
2) 打开要进行通信的USB设备的句柄。首先依次调用usb_find_busses、usb_find_devices和usb_get_busses这三个函数,获得已找到的USB总线序列;然后通过链表遍历所有的USB设备,根据已知的要打开USB设备的ID(VID/PID),找到相应的USB设备;最后调用usb_open函数打开该USB设备(在这里假设总线上没有相同VID和PID的USB设备。如果总线上存在着相同VID和PID的设备,还需要进行其他条件判断,比如设备名称,以保证是打开的是期望的USB设备)。
3) 与USB设备进行通信。使用usb_control_msg函数,向USB设备读取数据或写入数据。
4) 关闭USB设备。完成所有 *** 作后,调用usb_close函数关闭已经打开的USB设备。
具体流程去编程论坛,有清楚流程!
good luck!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)