第一次移植的时候,可能由于对这个USB库还是太了解,可能改动了底层的我一个关键值,当移植完成之后,在测试的过程发现,总是会出现某一次的数据只发送了一小段,而剩下的部分只有在我再次获取的时候会被发送,且对应这次的数据也会发送。

我的具体实现过程是这样的:通过上位机下发一条指令,当单片机识别指令之后会一次上传2000字节的数据,而测试中出现第4*n次要求数据的时候,总是会 只上传一部分,剩下的会在4*n+1次上传,且4*n+1对应的2000字节也会上传。(图1、图2)。


第一步:先来看看USB发送数据的机制,从usbd_conf.h文件中可以知道"#define APP_RX_DATA_SIZE  2048"这个宏定义,结合usbd_cdc_core.c文件中的函数usbd_cdc_DataIn()可以看出USB的发送方式是通过一个2048字节的FIFO,每次发送不大于64Byte的数据(图3);


第二步:通过查找方式可以找到,函数usbd_cdc_DataIn()是被函数Handle_USBAsynchXfer()调用的,而在分析该函数的时候会发现,数据在发送的时候,如果这次发送的数据不会越过2048,则这次的数据会被一次发送完成,如果超过2048(循环FIFO),数据会分两次发送(图4);

第三步:知道了上面的发送原理,接下来可以看看我遇到的问题,第一次发送2000字节OK,第二次发送2000字节OK,第三次发送2000字节OK,第四次144字节!并且会在第五次发送1856+2000字节!我画了一张图如下所示,一行代表一次传输,蓝色为某次的开始,红色为某次的结束,阴影重的地方是空白没有传输,阴影轻的地方是出错的地方(图5);

第四步:经过多次测试发现,这种错误很规律,在传输的次数是4的倍数的时候就会出现这种错误,刚开始分析以为是FIFO溢出了,但是我是通过指令来让一次数据进行传输的,而我发的指令之间的间隔很长,且每次只发送2000,离2048还有剩余,所以排除了溢出的可能(个人认为排除!);

第五步:无奈之下只能进行仿真了,分析可行的方式之后,在函数usbd_cdc_DataIn()中if条件语句里的"USB_Tx_State = 0;"这条语句之前添加断点,将变量APP_Rx_ptr_out和APP_Rx_ptr_in和APP_Rx_length添加到watch窗口(图6);


第六步:开始仿真。先让程序全速运行,然后下发指令,再全速运行,再下发指令,如此重复,直到第五次数据传输结束,记录每一步传输过程中这几个变量的变化情况(图7);

第七步:从仿真的结果来看,上层变量在出错的地方值的变化是正确的,从这里也可以反应出来,目前接触到的上层和中间层已经处理好了数据的发送,在更底层的发送中可能存在缓存方面的逻辑,导致到了第4*n次发送的时候出现问题,而对于我进行第二次移植的时候这个问题目前还没出现,分析可能是由于自己刚开始不懂,修改了底层某个地方,现在找不到了,由于精力有限就不继续追究了,等闲下来的时候再找找问题所在,当然,有哪位大神知道的望告知一声,多谢啦!

STM32F107——OTG模块之USB设备之虚拟串口移植(四)相关推荐

  1. VirtualBox :不能分配USB设备到虚拟电脑

    VirtualBox :不能分配USB设备到虚拟电脑 问题描述 在虚拟机设置的USB设备中添加了笔记本自带的摄像头 在启动虚拟机挂载的时候,显示不能分配USB设备到虚拟电 USB Device 'Ac ...

  2. 解决:VBOX无法分配USB设备到虚拟电脑

    VBOX 虚拟系统:winxp 主机系统:win7 vbox版本:6.0 问题 无法分配USB设备到虚拟电脑 解决 1.下载安装VBOX拓展包 2. VBOX USB设置,配置滤波器选择需要的USB设 ...

  3. USB转串口与虚拟串口相关

    不是原创,网上查询整理. 目录 一.串口与并口 二.USB转串口.虚拟串口概念 三.串口占用问题 四.其他:多个程序共享一个串口数据 五.COM.COM+和DCOM与COM端口无关 一.串口与并口 ( ...

  4. 使用STM32CubeMX把USB配置成虚拟串口(virtual com port)

    应用场景: 本次在项目中,由于对方的上位机软件比较老旧. 该软件只能通过串口通讯.而我们的设备只引出了USB口.还好STM32 的USB类型可以设置成虚拟串口.所以可以通过把USB枚举成虚拟串口(vi ...

  5. STM32 USB复合设备(VCP虚拟串口+HID键盘)详解

    USB复合设备 介绍 USB复合设备与组合设备区别 USB描述符修改 修改CustomHID_Reset 修改CustomHID_Data_Setup 介绍 本次使用的是Keil 5+STM32F10 ...

  6. linux设备驱动之串口移植,Linux设备驱动之UART驱动结构

    一.对于串口驱动Linux系统中UART驱动属于终端设备驱动,应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动.要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中 ...

  7. linux设备驱动之串口移植,linux设备驱动之UART移植

    对于串口驱动的移植准备自己分析一下源代码的,但是发现自己好多地方都只知道一 些皮毛,不明白其中的道理,所以我上网搜的时候发现有好多人写了很多很好的文章了,下面我转载的这篇就非常不错,一个困恼我好久的问 ...

  8. 同时挂载二维码模块与4G模块时,导致4G模块连不上网都是USB设备)

    一.BUG现象 今天公司设备出现一个问题,在RK3399上的USB上插着三个设备,分别是4G模块.二维码模块与身份证模块,在这三个设备同时插在设备上时再开机,会出现4G模块连不上网络的情况,无论怎么插 ...

  9. 通用USB设备驱动源码分析

    通用USB设备驱动源码分析 Author:aaron 前段时间写了篇<qualcomm usb modem驱动小结>的文章, 描述了自己如何为高通的一个usb modem设备写驱动的过程, ...

最新文章

  1. ecplise 工具字体大小的调整
  2. 华为北大等打造的Transformer竟在CV上超过CNN
  3. c语言链表如何做成环,在C语言中单向链表环测试并返回环起始节点的实现方法...
  4. 设计模式 — Overview
  5. 深入理解java类加载
  6. 【Android 进程保活】应用进程拉活 ( 账户同步拉活 | 账号添加 | 源码资源 )
  7. pcss评分_GTA5画质设置 N卡画质选项设置指南
  8. openssl生成rsa密钥对和密钥格式转换
  9. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
  10. 常用Apache Commons工具类备忘
  11. git 操作简明扼要,命令不需要多,够用就行
  12. Webpack 4进阶--从前的日色变得慢 ,一下午只够打一次包
  13. npm ERR! Please try running this command again as root/Administrator.
  14. php 前往页面,PHP实现网页截图?
  15. python123判断性别程序_听说听胎心能够预测宝宝性别?这是真的吗?
  16. 统计bytearray中的bitcount
  17. python画心形代码大全_七夕 - 程序员表白代码
  18. 计算机成绩数字代表什么意思,注册电气工程师成绩的数字具体代表着什么意思...
  19. 电磁场与电磁波第四版 课后习题
  20. 成功解决excel表格隐藏后右键全选列取消隐藏始终找不出来

热门文章

  1. cpth计算机组成原理实验,计算机组成原理实验指导书-CPTH
  2. 湖南中创教育PMP项目管理——团队管理
  3. @html.textbox的使用方法,ASP.NET中 TextBox 文本输入框控件的使用方法
  4. 微信小程序列表点赞功能
  5. java数据字典开发实例,实战解析
  6. Axure实时更新项目
  7. 解决Ubuntu19.04英伟达(NVIDIA)显卡驱动安装问题
  8. chrome浏览器网页刷新的console代码
  9. 谷歌眼镜Mirror API开发指南之Subscriptions
  10. 【Java技术系列】爱情36技之暗送秋波的技术