yixin1851 发表于 2013-12-28 18:33:14

又是libusbx! 怎么使用控制传输发送数据

各位大侠:
为了使用QT,之前实验采用LIBUSBX可以读写USB 了,下位机采用的STM32 USB 3.0的库。
以为LIBUSBX 驱动USB没有问题了,但是现在问题来了。
一项目,刚开始没有关注下位机部分(别人写的),我只是读取数据,没有问题。
目前已经基本将GUI做好,开始做USB发送数据部分,下位机死活就是接收不到数据,采用C#的USB库下位机可以接受数据,但改C#,时间上太紧了。

阅读下位机代码,发现USB库是1.1版本的, PC采用中断传输接受,控制传输发送。我之前的实验是断传输接受,中断传输发送.

现在变成了控制传输发送,下位机死活接收不到数据。

上位机控制传输代码我只使用了下面这个函数:
ibusb_control_transfer(libusb_device_handle *dev_handle,uint8_t request_type, uint8_t bRequest, uint16_t wValue, uint16_t wIndex,unsigned char *data, uint16_t wLength, unsigned int timeout);

ret= libusb_control_transfer(usb_device,0X00,0X09,0X01,0,data,64,5000);
返回值 ret =64 是正确的,但是下位机没有反应。

求高手指点!奉上全部莫元!

canspider 发表于 2013-12-28 22:39:04

既然采用c#的库可以正常收发,楼主可以这样试试
装一个bushound或是别的抓包工具,抓出你用c#通讯成功的包
然后再抓libusb发出的包,与之前的进行对比,看看是哪些地方出问题了
个人觉得可能是格式或者是大小端的问题

yixin1851 发表于 2013-12-29 09:19:02

canspider 发表于 2013-12-28 22:39
既然采用c#的库可以正常收发,楼主可以这样试试
装一个bushound或是别的抓包工具,抓出你用c#通讯成功的包
...

感谢回复
C#的USB库是别人的封装好的,每次发送64字节,看不到大小端的问题。
我自己也用BUSHONUD抓过,可是USB功底不好,分析不出问题所在。
先补下USB基础,再试试。

yixin1851 发表于 2013-12-29 09:42:29

canspider 发表于 2013-12-28 22:39
既然采用c#的库可以正常收发,楼主可以这样试试
装一个bushound或是别的抓包工具,抓出你用c#通讯成功的包
...

请教一下:
在USB规范里,有11个标准命令(Request),它们分别是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。

我详细看了每个命令的作用,但是就没有看明白哪个命令是用来传送数据的?

bhy 发表于 2013-12-28 18:33:15

1. 首先要看你传输的数据量大小。一般数据量不大,是可以用控制端点的(不过这个风格不太好)。
2. 其实不管哪个端点,你就把它当成一串数据来看。只是有些端点在特定的位置需要有特定的数据来支撑命令的解析而已。
3. 我之前也用控制端点干过数据传输,不过都是几个数据。如果数据量大,还是用批量或者中断。

对于你要解决的问题,把控制端点当成数据来看就行。当然,像数据传输方向这些的,其实也包含在数据里。我想你时不能把它当成数据的。所以,每次你能传输的数据并不多。
是不是一定要是标准命令,那也未必。所以不用在标准命令里找。

目前比较快捷的方法是看底层的接收代码,按照它的要求发数据即可。

yixin1851 发表于 2013-12-29 11:04:06

bhy 发表于 2013-12-29 10:33
1. 首先要看你传输的数据量大小。一般数据量不大,是可以用控制端点的(不过这个风格不太好)。
2. 其实不 ...

非常感谢回复

下位机端点0配置大小为64个字节,请教:
1.不在标准命令里找,那使用什么命令呢,怎么确定命令啊?
2.如何看底层接收代码呢?上位机ret= libusb_control_transfer(usb_device,0X00,0X09,0X01,0,data,64,5000);返回值 ret =64 应该是正确的,但下位机USB接收不会进入到下面的函数中SetOutReport()处:
BOOL HID_SetReport (void)
{
    unsigned char i;
    /* ReportID = SetupPacket.wValue.WB.L; */
    switch (SetupPacket.wValue.WB.H)
    {
      case HID_REPORT_INPUT:
            return (FALSE);          /* Not Supported */
      case HID_REPORT_OUTPUT:
            for (i = 0; i < 64; i++)
            {
                OutReport = EP0Buf;
            }
            SetOutReport();
            break;
      case HID_REPORT_FEATURE:
            return (FALSE);          /* Not Supported */
    }
    return (TRUE);
}

bhy 发表于 2013-12-29 11:37:43

楼主,你已经快接近成功了。现在只要看看为什么没有收到就可以了。多多看看上位机发出的数据吧。用 bushound。

yixin1851 发表于 2013-12-29 16:38:22

bhy 发表于 2013-12-29 11:37
楼主,你已经快接近成功了。现在只要看看为什么没有收到就可以了。多多看看上位机发出的数据吧。用 bushoun ...

感谢回复

Jach 发表于 2013-12-30 19:00:59

request_type is "class", not standard. bRequest is set_report.

dr2001 发表于 2013-12-30 19:44:12

本帖最后由 dr2001 于 2013-12-30 19:55 编辑

看能用的代码是怎么发控制传输请求的,然后照发就行了啊,这个是不会有区别的。

楼主位置的代码发了一个Set_Configuration的请求。。。
这是一个标准的USB请求,要按照USB标准的规定发,不可乱发;尤其是你的Device用的是某个Framework的话,这种错误请求可以导致EP0 Stall。

控制传输在Device侧,就是EP0先收到一组数据(8Bytes),然后EP0进行一系列的IN和OUT操作,完成。只不过USB协议规定了标准的操作,必须要遵守,别的就无所谓了。

canspider 发表于 2013-12-30 21:38:42

楼主抓几个包出来吧
成功的抓点,失败的抓点,大家分析分析

yixin1851 发表于 2013-12-31 08:42:29

感谢楼上各位的热心回复。
bhy与canspider的建议对我很有帮助。问题解决了,libusb_control_transfer(usb_device,0X21,0X09,0X0200,0,data,64,5000); 按照此方式发送就可以了。
但是我还是不知道为什么这样做?先把项目结了,再回过头来学习。
但是莫元该给谁呢?

bhy 发表于 2014-1-4 16:37:16

大家平分吧。{:titter:}

yixin1851 发表于 2014-1-11 09:02:38

bhy 发表于 2013-12-28 18:33
1. 首先要看你传输的数据量大小。一般数据量不大,是可以用控制端点的(不过这个风格不太好)。
2. 其实不 ...

感谢您的支持,您给予了很好的建议并多次回复我,所以莫元就给您了。
再次感谢您,再次感谢其他的热心莫友。

不过还有一问题请教您,就是控制传输非标准命令怎么理解,在哪里找?
request_type = 0x21,表示主机至设备,种类是类,接受者是接口;为什么是0x21,主机是怎么得到的0x21的呢?
bRequest = 0x09,表示标准命令是SET_CONFIGURATION,为什么是这个请求啊?
wValue = 0x0200,配置值(高字节为0,低字节表示要设置的配置值),这里高字节为0x02,是怎么来的?其他非0值可以吗?
wIndex = 0;这是为什么是0 呢?

百度了好久还是不理解,还请您指点。

yixin1851 发表于 2014-1-11 09:42:09

yixin1851 发表于 2014-1-11 09:02
感谢您的支持,您给予了很好的建议并多次回复我,所以莫元就给您了。
再次感谢您,再次感谢其他的热心莫 ...

http://lxxavr.blog.163.com/blog/static/14029914720122299148278/
在这里找到了答案

soos 发表于 2014-1-13 18:03:33

libusb 如何检测USB是断开状态还是连接状态?

yixin1851 发表于 2014-1-13 19:42:57

soos 发表于 2014-1-13 18:03
libusb 如何检测USB是断开状态还是连接状态?

这个没有玩过。
我想应该用open函数,看返回值是否为NULL就可以判断了吧。
页: [1]
查看完整版本: 又是libusbx! 怎么使用控制传输发送数据