打印
[数据传输]

stm32例程修改的自定义hid设备,在配置高的pc上速度反而慢了

[复制链接]
6610|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
下位机用的是STM32F103ZCT6 ,使用CustomHID例程修改的程序,现在上下位机都已调通,能正常通行,数据传输使用端点1中断模式发送和接收固定64字节一包的数据,发现一个问题,同一个的上下位机,在我的pc(双核2.5GHz)上进行一次完整的数据传输大概在5s左右,但在配置更高的pc(四核3.2GHz)上居然要46s左右,还有一个比我pc配置稍高的电脑上也要23s左右,比我差的电脑通信时间稳定在5s左右。bushound观察数据发现,是pc接收到下位机的数据时间长了,但我端点的轮询时间bInterval设置在1ms了,这个设置在我pc上能体现出来,在配置高的电脑上不起作用,稳定在30ms左右pc才接收到下位机的数据,下面分别是我的pc和配置更高的pc的bushound的截图
下面是我的描述符信息,请大神们帮忙看看我的问题出在哪里,非常感谢!
const uint8_t CustomHID_DeviceDescriptor[CUSTOMHID_SIZ_DEVICE_DESC] =
  {
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize40*/
    0x36,                       /*idVendor (0x2A36)*/
    0x2A,
    0x11,                       /*idProduct = 0x0011*/
    0x00,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*Index of string descriptor describing
                                              manufacturer */
    2,                          /*Index of string descriptor describing
                                             product*/
    3,                          /*Index of string descriptor describing the
                                             device serial number */
    0x01                        /*bNumConfigurations*/
  }
  ; /* CustomHID_DeviceDescriptor */

/* USB Configuration Descriptor */
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
  {
    0x09, /* bLength: Configuation Descriptor size */
    USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
    CUSTOMHID_SIZ_CONFIG_DESC,
    /* wTotalLength: Bytes returned */
    0x00,
    0x01,         /* bNumInterfaces: 1 interface */
    0x01,         /* bConfigurationValue: Configuration value */
    0x00,         /* iConfiguration: Index of string descriptor describing
                                 the configuration*/
    0xC0,         /* bmAttributes: Bus powered */
    0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus */

    /************** Descriptor of Custom HID interface ****************/
    /* 09 */
    0x09,         /* bLength: Interface Descriptor size */
    USB_INTERFACE_DESCRIPTOR_TYPE,/* bDescriptorType: Interface descriptor type */
    0x00,         /* bInterfaceNumber: Number of Interface */
    0x00,         /* bAlternateSetting: Alternate setting */
    0x02,         /* bNumEndpoints */
    0x03,         /* bInterfaceClass: HID */
    0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */
    0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */
    0,            /* iInterface: Index of string descriptor */
    /******************** Descriptor of Custom HID HID ********************/
    /* 18 */
    0x09,         /* bLength: HID Descriptor size */
    HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */
    0x10,         /* bcdHID: HID Class Spec release number */
    0x01,
    0x00,         /* bCountryCode: Hardware target country */
    0x01,         /* bNumDescriptors: Number of HID class descriptors to follow */
    0x22,         /* bDescriptorType */
    CUSTOMHID_SIZ_REPORT_DESC,/* wItemLength: Total length of Report descriptor */
    0x00,
    /******************** Descriptor of Custom HID endpoints ******************/
    /* 27 */
    0x07,          /* bLength: Endpoint Descriptor size */
    USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */

    0x81,          /* bEndpointAddress: Endpoint Address (IN) */
    0x03,          /* bmAttributes: Interrupt endpoint */
    0x40,          /* wMaxPacketSize: 64 Bytes max */
    0x00,
    0x01,          /* bInterval: Polling Interval (1 ms) */
    /* 34 */
   

2.JPG (194.15 KB )

2.JPG

1.JPG (160.01 KB )

1.JPG

相关帖子

沙发
xianshouer|  楼主 | 2013-7-26 08:46 | 只看该作者
自顶一下,要速度搞不上去,那就等于白做了,急啊,求高人指点

使用特权

评论回复
板凳
xianshouer|  楼主 | 2013-7-30 10:47 | 只看该作者
问题终于解决了,
在下位机向pc上行64字节数据后紧接着再发送一个空数据,然后pc机接受到数据就稳定在2ms了,虽然比1ms慢了点,但速度还是可以接受。
while(1)
{
  if (GetEPTxStatus(ENDP1) != EP_TX_VALID)
  {
    SetEPTxCount(ENDP1, 0);
    SetEPTxValid(ENDP1);        //设置端点有效,以发送数据
    break;
  }                               
}       

个人认为这个30ms因为我每次都是64字节满包发送,有的pc会认为发送的数据没完,然后就会等上这个30ms。
所以另一个问题出来了,其实我每次的收发有效数据长度不用64字节,这个64字节我是凑出来的,但是我那做上位机的哥们说如果不固定64个字节,他读写都不能成功,但是我用bushound发送接收测试都没有64字节的限制,64字节以下任意长度都可以,所以我只能凑满64字节收发,有没有哪位大神能说说上位机怎么做的跟bushound那样牛x,在此谢过了。

使用特权

评论回复
地板
computer00| | 2013-10-20 21:36 | 只看该作者
应该是你那个哥们的软件没调好,不到64字节照样可以很好的读取的,这个不用质疑。

使用特权

评论回复
5
sddzycnq| | 2013-12-3 17:49 | 只看该作者
本帖最后由 sddzycnq 于 2013-12-3 18:05 编辑
xianshouer 发表于 2013-7-30 10:47
问题终于解决了,
在下位机向pc上行64字节数据后紧接着再发送一个空数据,然后pc机接受到数据就稳定 ...

包长不大于64的时候,上位机还是会等。请教这是什么原因呢?
再就是,如果发送的包长恰好等于64,那岂不是每次都要再发个SetEPTxCount(ENDP1, 0);
这样发送一次,虽然包长为0,但白白浪费了一个毫秒。
有没有更好的办法呢?

使用特权

评论回复
6
sddzycnq| | 2013-12-4 08:23 | 只看该作者
computer00 发表于 2013-10-20 21:36
应该是你那个哥们的软件没调好,不到64字节照样可以很好的读取的,这个不用质疑。 ...
包长不大于64的时候,上位机还是会等。请教这是什么原因呢?
再就是,如果发送的包长恰好等于64,那岂不是每次都要再发个SetEPTxCount(ENDP1, 0);
这样发送一次,虽然包长为0,但白白浪费了一个毫秒。
有没有更好的办法呢?


圈圈大侠能批点下吗?

使用特权

评论回复
7
klffnj| | 2013-12-4 09:24 | 只看该作者
上位机usb数据请求超时限制设多少?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

39

帖子

0

粉丝