打印
[STM32F2]

STM32F205 使用USB CDC 类不能发送 64 的倍数的数据

[复制链接]
3182|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
5768340|  楼主 | 2014-11-20 12:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
      我使用 STM32F205 的官方的 USB 库做虚拟串口 ,不能发送64的倍数的数据 ,请问怎么解决呢 ?我用的库是 STM32_USB-Host-Device_Lib_V2.1.0
沙发
icecut| | 2014-11-20 13:07 | 只看该作者
8的倍数呢?

如果数据分包最后一包正好发完要发0长度包表示结束.usb 是这么实现的.
你确认一下版本,前后换换版本测试.

使用特权

评论回复
板凳
5768340|  楼主 | 2014-11-20 16:37 | 只看该作者
icecut 发表于 2014-11-20 13:07
8的倍数呢?

如果数据分包最后一包正好发完要发0长度包表示结束.usb 是这么实现的.

8倍的数据正常 , 我修改了一下 ,现在能够发送64的倍数了 ,可是发送不了最大的数据个数  ,比如我定义能够发送的最大数据个数为 4096 ,死活发不出去

使用特权

评论回复
地板
icecut| | 2014-11-20 19:07 | 只看该作者
5768340 发表于 2014-11-20 16:37
8倍的数据正常 , 我修改了一下 ,现在能够发送64的倍数了 ,可是发送不了最大的数据个数  ,比如我定义 ...

软件拆包吧

使用特权

评论回复
5
mmuuss586| | 2014-11-20 19:26 | 只看该作者
5768340 发表于 2014-11-20 16:37
8倍的数据正常 , 我修改了一下 ,现在能够发送64的倍数了 ,可是发送不了最大的数据个数  ,比如我定义 ...

分开发送(分包);

使用特权

评论回复
6
cool_coder| | 2014-11-20 21:27 | 只看该作者
确实有这个问题,我也遇到了。应该是如#2L所说,没有发ZLP。

使用特权

评论回复
7
5768340|  楼主 | 2014-11-21 00:38 | 只看该作者
cool_coder 发表于 2014-11-20 21:27
确实有这个问题,我也遇到了。应该是如#2L所说,没有发ZLP。

我用的 V2.1.0 库 ,不知道你说的发ZLP 是在哪个地方发送呢 ? 你的问题解决了吗 ?

使用特权

评论回复
8
5768340|  楼主 | 2014-11-21 00:40 | 只看该作者
mmuuss586 发表于 2014-11-20 19:26
分开发送(分包);

不太懂你说的分包发送具有的实现方式是什么呢 ?第一次用 USB 的功能 ,谢谢指点

使用特权

评论回复
9
zqjqq88| | 2014-11-21 08:55 | 只看该作者
5768340 发表于 2014-11-21 00:40
不太懂你说的分包发送具有的实现方式是什么呢 ?第一次用 USB 的功能 ,谢谢指点  ...

假如你的数据一共2048字节,单包是64字节,那么你要发送128次~就这样一次次发~

使用特权

评论回复
10
5768340|  楼主 | 2014-11-21 09:53 | 只看该作者
zqjqq88 发表于 2014-11-21 08:55
假如你的数据一共2048字节,单包是64字节,那么你要发送128次~就这样一次次发~ ...

首先我为了一次可以发送更多的数据将 usbd_conf.h 中的宏进行了修改如下所示
 #define CDC_DATA_MAX_PACKET_SIZE       64  
#define CDC_CMD_PACKET_SZE             8  

#define CDC_IN_FRAME_INTERVAL        5   
#define APP_RX_DATA_SIZE              4096


之后出现了不能够发送 64 的倍数的数据 ,于是我又将 usbd_cdc_core.c 函数的
static uint8_t  usbd_cdc_DataIn (void *pdev, uint8_t epnum)
{
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;

  if (USB_Tx_State == 1)
  {
    if (APP_Rx_length == 0)
    {
      USB_Tx_State = 0;
    }
    else
    {
      if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
        USB_Tx_ptr = APP_Rx_ptr_out;
        USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
        
        APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
        APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;   
      }
      else
      {
        USB_Tx_ptr = APP_Rx_ptr_out;
        USB_Tx_length = APP_Rx_length;
        
        APP_Rx_ptr_out += APP_Rx_length;
        APP_Rx_length = 0;
      }
      
      /* Prepare the available data buffer to be sent on IN endpoint */
      DCD_EP_Tx (pdev,
                 CDC_IN_EP,
                 (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
                 USB_Tx_length);
    }
  }  
  
  return USBD_OK;
}

测试的时候发现 当数据个数为64 的倍数的时候APP_Rx_length = 0 ,找了一下 ,没找到在哪里于是做了如下修改
static uint8_t  usbd_cdc_DataIn (void *pdev, uint8_t epnum)
{
  uint16_t USB_Tx_ptr;
  uint16_t USB_Tx_length;

  if (USB_Tx_State == 1)  //发送状态为 1
  {
    if (APP_Rx_length == 0) //数据长度为 0 ,当发送64 个字节的时候 APP_Rx_length =0
    {
      USB_Tx_State = 0;       //发送状态清 0
                       
      USB_Tx_ptr = APP_Rx_ptr_out;
      USB_Tx_length = APP_Rx_length;
         
       APP_Rx_ptr_out += APP_Rx_length;
   
     DCD_EP_Tx (pdev,
                 CDC_IN_EP,
                 (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
                 USB_Tx_length);
    }
    else
    {
                       
      if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
        {
        
        USB_Tx_ptr = APP_Rx_ptr_out;
        USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; //发送长度等于 64
        
        APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
        APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;   
                                       
       }
      else   
      {
        USB_Tx_ptr = APP_Rx_ptr_out;
        USB_Tx_length = APP_Rx_length;
         
        APP_Rx_ptr_out += APP_Rx_length;
        APP_Rx_length = 0;
      }
      
      DCD_EP_Tx (pdev,
                 CDC_IN_EP,
                 (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
                 USB_Tx_length);
    }
  }  
  
  return USBD_OK;
}


结果就不能发送 4096 个数据了 ,希望能帮忙看看问题,谢谢

使用特权

评论回复
11
玄德| | 2014-11-21 12:16 | 只看该作者
库函数的用户数据管理程序有漏洞,
DCD_EP_Tx 调用一次,就是一包。


使用特权

评论回复
12
5768340|  楼主 | 2014-11-21 12:38 | 只看该作者
玄德 发表于 2014-11-21 12:16
库函数的用户数据管理程序有漏洞,
DCD_EP_Tx 调用一次,就是一包。

好的 ,谢谢 ,我再去试一试

使用特权

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

本版积分规则

3

主题

33

帖子

0

粉丝