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

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, 下载次数: 28, 下载积分: 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)。

嗯,应该可用,那么发送完毕有中断吗?
ligongxiaobie 回答时间:2017-12-19 09:30:16
creep 发表于 2017-12-18 15:52
目前keil还不能在工程下的文件夹下面再次建立子文件夹。

这个真的很坑,把KEIL弄成了编写大工程很不方便的一种工具
ligongxiaobie 回答时间:2017-12-19 11:31:29
ctang 发表于 2017-12-19 09:20
然后main函数去轮询 if(USB_USART_RX_STA&0x8000)。

前辈 我试过你给的代码 放到相应的地方,串口第一次发数据会调到这个函数里,但是数取不出来,第二次发USB就直接死掉了。
程序应该写的没问题,CUBE生成的,USB向电脑发是可以用的,但是反过来用你的程序就不行了。
ctang 回答时间:2017-12-20 10:46:44
main函数用while去轮询呀。
ctang 回答时间:2017-12-20 10:50:25
mogutou123 回答时间:2019-8-2 17:46:07
好资料

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版