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

[复制链接]
 楼主| 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的倍数了 ,可是发送不了最大的数据个数  ,比如我定义 ...

软件拆包吧
mmuuss586 发表于 2014-11-20 19:26 | 显示全部楼层
5768340 发表于 2014-11-20 16:37
8倍的数据正常 , 我修改了一下 ,现在能够发送64的倍数了 ,可是发送不了最大的数据个数  ,比如我定义 ...

分开发送(分包);
cool_coder 发表于 2014-11-20 21:27 | 显示全部楼层
确实有这个问题,我也遇到了。应该是如#2L所说,没有发ZLP。
 楼主| 5768340 发表于 2014-11-21 00:38 | 显示全部楼层
cool_coder 发表于 2014-11-20 21:27
确实有这个问题,我也遇到了。应该是如#2L所说,没有发ZLP。

我用的 V2.1.0 库 ,不知道你说的发ZLP 是在哪个地方发送呢 ? 你的问题解决了吗 ?
 楼主| 5768340 发表于 2014-11-21 00:40 | 显示全部楼层
mmuuss586 发表于 2014-11-20 19:26
分开发送(分包);

不太懂你说的分包发送具有的实现方式是什么呢 ?第一次用 USB 的功能 ,谢谢指点
zqjqq88 发表于 2014-11-21 08:55 | 显示全部楼层
5768340 发表于 2014-11-21 00:40
不太懂你说的分包发送具有的实现方式是什么呢 ?第一次用 USB 的功能 ,谢谢指点  ...

假如你的数据一共2048字节,单包是64字节,那么你要发送128次~就这样一次次发~
 楼主| 5768340 发表于 2014-11-21 09:53 | 显示全部楼层
zqjqq88 发表于 2014-11-21 08:55
假如你的数据一共2048字节,单包是64字节,那么你要发送128次~就这样一次次发~ ...

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

  3. #define CDC_IN_FRAME_INTERVAL        5   
  4. #define APP_RX_DATA_SIZE              4096


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

  5.   if (USB_Tx_State == 1)
  6.   {
  7.     if (APP_Rx_length == 0)
  8.     {
  9.       USB_Tx_State = 0;
  10.     }
  11.     else
  12.     {
  13.       if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE){
  14.         USB_Tx_ptr = APP_Rx_ptr_out;
  15.         USB_Tx_length = CDC_DATA_IN_PACKET_SIZE;
  16.         
  17.         APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
  18.         APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;   
  19.       }
  20.       else
  21.       {
  22.         USB_Tx_ptr = APP_Rx_ptr_out;
  23.         USB_Tx_length = APP_Rx_length;
  24.         
  25.         APP_Rx_ptr_out += APP_Rx_length;
  26.         APP_Rx_length = 0;
  27.       }
  28.       
  29.       /* Prepare the available data buffer to be sent on IN endpoint */
  30.       DCD_EP_Tx (pdev,
  31.                  CDC_IN_EP,
  32.                  (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
  33.                  USB_Tx_length);
  34.     }
  35.   }  
  36.   
  37.   return USBD_OK;
  38. }

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

  5.   if (USB_Tx_State == 1)  //发送状态为 1
  6.   {
  7.     if (APP_Rx_length == 0) //数据长度为 0 ,当发送64 个字节的时候 APP_Rx_length =0
  8.     {
  9.       USB_Tx_State = 0;       //发送状态清 0
  10.                        
  11.       USB_Tx_ptr = APP_Rx_ptr_out;
  12.       USB_Tx_length = APP_Rx_length;
  13.          
  14.        APP_Rx_ptr_out += APP_Rx_length;
  15.    
  16.      DCD_EP_Tx (pdev,
  17.                  CDC_IN_EP,
  18.                  (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
  19.                  USB_Tx_length);
  20.     }
  21.     else
  22.     {
  23.                        
  24.       if (APP_Rx_length > CDC_DATA_IN_PACKET_SIZE)
  25.         {
  26.         
  27.         USB_Tx_ptr = APP_Rx_ptr_out;
  28.         USB_Tx_length = CDC_DATA_IN_PACKET_SIZE; //发送长度等于 64
  29.         
  30.         APP_Rx_ptr_out += CDC_DATA_IN_PACKET_SIZE;
  31.         APP_Rx_length -= CDC_DATA_IN_PACKET_SIZE;   
  32.                                        
  33.        }
  34.       else   
  35.       {
  36.         USB_Tx_ptr = APP_Rx_ptr_out;
  37.         USB_Tx_length = APP_Rx_length;
  38.          
  39.         APP_Rx_ptr_out += APP_Rx_length;
  40.         APP_Rx_length = 0;
  41.       }
  42.       
  43.       DCD_EP_Tx (pdev,
  44.                  CDC_IN_EP,
  45.                  (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
  46.                  USB_Tx_length);
  47.     }
  48.   }  
  49.   
  50.   return USBD_OK;
  51. }


结果就不能发送 4096 个数据了 ,希望能帮忙看看问题,谢谢
玄德 发表于 2014-11-21 12:16 | 显示全部楼层
库函数的用户数据管理程序有漏洞,
DCD_EP_Tx 调用一次,就是一包。


 楼主| 5768340 发表于 2014-11-21 12:38 | 显示全部楼层
玄德 发表于 2014-11-21 12:16
库函数的用户数据管理程序有漏洞,
DCD_EP_Tx 调用一次,就是一包。

好的 ,谢谢 ,我再去试一试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部