你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

usb虚拟串口,如何判断数据是否被搬运完毕

[复制链接]
ligongxiaobie 提问时间:2017-12-16 10:38 /
附件是从网上下载的,貌似是官方工程师帮助客户解决问题的。
但是只说原因,并没有说如何解决,看了很久自己并没有解决这个问题,所以来这里问问,如何解决。
我现在的解决方法是这样的
  1. uint16_t VCP_DataTx (uint8_t data)
  2. {  
  3.         APP_Rx_Buffer[APP_Rx_ptr_in]=data;        //写入发送buf
  4. //        while(1)
  5.         {
  6.                 APP_Rx_ptr_in++;

  7.                 if((APP_Rx_ptr_in) ==APP_Rx_ptr_out)
  8.                 {
  9. //                        while(1)
  10. //                        {
  11. //                                if(USB_Tx_State==0)
  12. //                                break;
  13. //                        }
  14.                         timet2++;
  15.                         printf("第 %d 次进入2模式\r\n",timet2);
  16.                         delay_ms(10);
  17.                 }
  18.                 if(APP_Rx_ptr_in==APP_RX_DATA_SIZE)        //超过buf大小了,归零.
  19.                 {
  20.                         APP_Rx_ptr_in = 0;
  21.                 }
  22.         }

  23.         return USBD_OK;
  24. }
复制代码
我现在的解决办法是当APP_Rx_ptr_in==APP_Rx_ptr_out的时候,加固定延时,之前判断USB_Tx_State实际上也没有解决自己的问题,就用了现在的加延时方法,但是这个是治标不治本。请问如何判断USB把数据搬运出去呢?
查了很久也没有人说这个事。
希望各位能帮忙看一下。

VCP例程用于数据传输时丢失数据的处理.pdf

下载

159.79 KB, 下载次数: 22, 下载积分: ST金币 -1

收藏 评论14 发布时间:2017-12-16 10:38

举报

14个回答
ligongxiaobie 回答时间:2017-12-16 11:27:00
赶上周末提问,没人理吗?
ligongxiaobie 回答时间:2017-12-16 15:56:41
请斑竹帮忙看下呗。这个应该是通病,不是个例吧
creep 回答时间:2017-12-16 21:34:23
修改函数自己判断,参考下面的例子。

高速USB VCP和全速USB VCP 速度对比
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
ligongxiaobie 回答时间:2017-12-18 14:29:39
creep 发表于 2017-12-16 21:34
修改函数自己判断,参考下面的例子。

高速USB VCP和全速USB VCP 速度对比

谢谢前辈指点,刚看到你的帖子的时候,我用CUBE 生成了一个CDC的虚拟串口,然后把您的usbd_cdc_interface.c函数放到工程中,确实随便发,不出堵的问题。
后来一想,发现原来是每64个字节是需要等一下的,这应该就是包发送的方法吧,之前也想到了用USB_Tx_State(我的那个工程是这样起名字的),但是那个是每APP_TX_DATA_SIZE等待一次,而不是这里的USB_PACK_SIZE 等待一次,就差在这里,我可以通过这个路子再试试。
谢谢,前辈!
另外问一个题外话,请问前辈,keil能在工程下的文件夹下面再次建立子文件夹吗?
maxtch 回答时间:2017-12-18 15:38:42
传输完毕有中断的
creep 回答时间:2017-12-18 15:52:38
ligongxiaobie 发表于 2017-12-18 14:29
谢谢前辈指点,刚看到你的帖子的时候,我用CUBE 生成了一个CDC的虚拟串口,然后把您的usbd_cdc_interface ...

目前keil还不能在工程下的文件夹下面再次建立子文件夹。
ligongxiaobie 回答时间:2017-12-19 08:56:36
maxtch 发表于 2017-12-18 15:38
传输完毕有中断的

请问前辈您说的中断在哪里呢?我用CUBE生成的CDC输出是自己写的。
ctang 回答时间:2017-12-19 09:20:13
  1. static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
  2. {
  3.   /* USER CODE BEGIN 6 */
  4.   USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
  5.   USBD_CDC_ReceivePacket(&hUsbDeviceFS);
  6.   
  7.   uint8_t res;
  8.   uint8_t i;
  9.   for(i=0; i<Len[0];i++)
  10.   {
  11.     res=Buf[i];
  12.     USB_USART_RX_Buffer[i]=res;
  13.     USB_USART_RX_STA++;
  14.   }  
  15.    USB_USART_RX_STA |= 0x8000;
  16.   
  17.   return (USBD_OK);
  18.   /* USER CODE END 6 */
  19. }
复制代码


然后main函数去轮询 if(USB_USART_RX_STA&0x8000)。
ligongxiaobie 回答时间:2017-12-19 09:29:28
ctang 发表于 2017-12-19 09:20
然后main函数去轮询 if(USB_USART_RX_STA&0x8000)。

嗯,应该可用,那么发送完毕有中断吗?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版