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

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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
VCP例程用于数据传输时丢失数据的处理.PDF

VCP 例程用于数据传输时丢失数据的处理 问题:问题: 问题问题:: 某客户工程师在其产品的设计中,使用了 STM32F205VET6STM32F205VET6。据其工程师讲述:他使用 ST 的USB 固件库 STM32F205VET6STM32F205VET6 中的 VCP 例程来实现虚拟串口的功能,但是他发现虚拟串口一次输出的数据(从串口到上位机)如果 超过 2Kbytes 就会造成数据丢失,只输出尾部的2Kbytes。客户工程师检查代码发现USB 的FIFO 大小 由宏定义APP_RX_DATA_SIZE 决定,而 APP_RX_DATA_SIZE 的大小刚好为2Kbytes。所以他认为此FIFO 设计太小而造成的,于是他将FIFO 的大小改成5Kbyte,不过修改后并不能解决问题。 调研:调研: 调研调研:: 1. 打开“STM32F105/7, STM32F2 and STM32F4 USB on-the-go Host and device library (UM1021)” 库里边的VCP 例程,位于“...\STM32_USB-Host- Device_Lib_V2.1.0\Project\USB_Device_Examples\VCP”中。对其进行测试,并没有出现所说的问 题,APP_RX_DATA_SIZE的大小仍然为2Kbytes,不管传输的数据是2Kbytes 还是5Kbytes 甚至是 25Kbytes,完全没有问题。 2. 了解客户程序UART 所设置的波特率,为115200,与原VCP例程一致。USB 采用的是Full Speed, 全速USB 总线的帧周期为1ms。 3. 在usbd_conf.h中可以看到APP_RX_DATA_SIZE 的定义在这里,为 2048,它定义了APP_Rx_Buffer 的大小。APP_Rx_Buffer其实是一个循环缓冲区,APP_Rx_ptr_in 指明了其数据进来的位置,当 USART 接收到数据时,将数据存储于 APP_Rx_ptr_in 指定的位置;APP_Rx_ptr_out 指明其数据取出 的位置,当USB 到FIFO 中取出数据时,起始地址由 APP_Rx_ptr_out 决定。 4. 打开 VCP 项目,观察其程序通信部分。当 USART 每接收到字节时,进入 EVAL_COM_IRQHandler 函数, 调用VCP_Tx(0,0)函数,将收到的字节存储于APP_Rx_Buffer[APP_Rx_ptr_in]中,在 APP_Rx_Buffer 中的位置由APP_Rx_ptr_in 指定。在 VCP_Tx 函数中, if(APP_Rx_ptr_in APP_RX_DATA_SIZE) { APP_Rx_ptr_in = 0; } 可以看到当APP_Rx_ptr_in 达到APP_RX_DATA_SIZE时,将其置 0,也就是在循环缓冲区中绕了一圈 回到缓冲区起始地址。 5. 再来看APP_Rx_Buffer 是如何被USB 取走,并送到上位机的。在 usbd_cdc_core.c 中,我们在 usbd_cdc_SOF 函数中看到: if (FrameCount++ CDC_IN_FRAME_INTERVAL) { FrameCount = 0; Handle_USBAsynchXfer(pdev); } 可以看到,USB 每CDC_IN_FRAME_INTERVAL 个帧调用一次 Handle_USBAsynchXfer 到APP_Rx_Buffer 中去取数据。CDC_IN_FRAME_INTERVAL 同样定义在 usbd_conf.h中,全速的时候,其值为 5。在定义 的这边,我们可以看到: APP_RX_DATA_SIZE*8/MAX_BAUDARATE*1000 should be CDC_IN_FRAME_INTERVAL

文档评论(0)

shiyouguizi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档