文章目录

  • 一、原因造成如下:
    • 1. 串口外设优先级大于USB中断(USBOTG_IRQn),导致串口数据打断USB,致使PC或MCU丢包。
    • 2. 当PC请求usb设备描述符字符串时,USB的其他通道不能发送数据,不然会导致通道0数据异常,导致PC丢包。
    • 3. USB整个发送逻辑
  • 其他

现象:pc重启过程中,不断发送按键数据,导致pc未能应答,致使下位机数据出现卡包现象。
MCU发送’B’,PC显示’C’,MCU发送’E’,PC显示’B’

一、原因造成如下:

1. 串口外设优先级大于USB中断(USBOTG_IRQn),导致串口数据打断USB,致使PC或MCU丢包。


2. 当PC请求usb设备描述符字符串时,USB的其他通道不能发送数据,不然会导致通道0数据异常,导致PC丢包。


系统只会请求字符串0-2,所以在此设置标志位即可。

3. USB整个发送逻辑

    // 此处解决PC开机过程中usb数据卡包问题。因为当pc请求字符串时,其他通道的数据发送会导致异常。if (get_usb_string_bus){get_usb_string_bus = false;biz_usb_queue_init();
#if BS_BLE_SUPPORTbiz_ble_queue_init();
#endifg_key_trigger_flag = false;g_combined_key_val = 0;g_usb_send_delay_tick = 0;LOG_D("<DEBUG> [USB] get_usb_string_bus\r\n");return;}// 按键数据发送if (g_key_trigger_flag){g_free_tick = 0;g_key_trigger_flag = false;biz_prot_hwic_usb_send_key_data(g_combined_key_val);sys_time_reset();}if (g_usb_send_delay_tick % 1400 == 0 && g_usb_send_delay_tick != 0){if (get_usb_device_status()){// 发送USB信息(将USB消息队列的内容,依次发送)if (biz_usb_data_dispose()){LOG_D("<DEBUG> [USB] send ok!!!\r\n");g_free_tick = 0;return;}}}g_free_tick++;if (g_free_tick % 10000 == 0 &&  g_free_tick != 0){// 判断usb fifo是否卡包get_usb_fifo_state();}
/*** @brief  usb发送数据给usb自定义通道(消息入队,非实时发送)* @param  *data: 欲发送内容* @param  len: 内容长度(字节大小)*/
void biz_usb_send_data(uint8_t *data, uint16_t len)
{if (get_usb_string_bus){LOG_D("<DEBUG> [biz_usb_send_data] queue bus fail\r\n");}if (!queue_en(&m_usb_recv_q, data, len)){LOG_D("<DEBUG> [biz_usb_send_data] queue full fail\r\n");}
}
/*** @brief  处理消息队列中的消息,通过usb发送(放在空闲线程使用)*/
bool biz_usb_data_dispose(void)
{if(!get_usb_device_is_free()){LOG_D("<DEBUG> [USB] send Fail not free\r\n");get_usb_fifo_state();biz_usb_queue_init();return false;}if(get_usb_tx_flag()){LOG_D("<DEBUG> [USB] send Fail send flag\r\n");return false;}if (!queue_de(&m_usb_drive_recv_q, g_usb_recv_data)){if (!queue_de(&m_usb_recv_q, g_usb_recv_data)){return false;}}if (usb_send(g_usb_recv_data, USB_RECV_Q_ITEM_SIZE) == false){LOG_D("<DEBUG> [USB] send Fail BUS\r\n");biz_usb_send_data(g_usb_recv_data, USB_RECV_Q_ITEM_SIZE);return false;}return true;
}

其他

[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包

[单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包(二)

[单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)

[单片机][at32][填坑日记] [USB卡包] usb上电过程中快速发包导致卡包(终章)相关推荐

  1. [单片机][at32][填坑日记] [USB卡包] usb快速发包导致卡包

    文章目录 一.问题现象 1. 发送频率过快,导致pc或mcu未能及时应答每一包,造成缓存区遗留上一次数据. 2. usb频发拔插枚举,导致pc/mcu数据丢失, ①mcu丢失数据,每次发送都只能发送上 ...

  2. [单片机][cx32][填坑日记] 从AC5到AC6 flash写入功能异常

    通过keil ide 把编译换成AC6,发现flash写入失效了,通过仿真发现,栈数据全部异常了(错位).于是找到了uint64_td导致的异常. 先看看修复内容:

  3. Vue入门到上手(10)—— VueJs 填坑日记之在项目中使用Amaze UI

    Vue入门到上手(10)-- VueJs 填坑日记之在项目中使用Amaze UI 上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Ama ...

  4. 20150726 填坑日记

    三中内填坑: 1. 组合数递推什么的 C(m,n)=C(m,n-1)+C(m-1,n-1).填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个 ...

  5. android多语言插件,Android 7.0多语言适配,填坑日记(附多语言插件)

    背景 最近项目在适配7.0系统的时候发现一些问题,其中也有多语言适配的问题,就拿出来说说,记记笔记,填填坑. 问题1 因为刚接手项目不久,发现一些奇奇怪怪的bug总是让人头疼,最近发现了在华为荣耀7. ...

  6. WindowsPhoneWindows8.1Windows8Unity3d 填坑日记

    最近的游戏开发大体上接近尾声,总结了不少关于Unity3d面向Windows几大平台开发时遇到的各种坑以及如何填坑的经验.总的来说,Windows8.1 Windows8/RT以及WindowsPho ...

  7. Hadoop Dynamometer工具详细教程,填坑日记

    Dynamometer工具使用步骤 Dynamometer 介绍 准备"材料" 原理 注意事项 流程 1.fsimage 2.hadoop binary 3.Configurati ...

  8. 八、VueJs 填坑日记之参数传递及内容页面的开发

    我们在上一篇博文中,渲染出来了一个列表,并在列表中使用了router-link标签,标签内的:to就是链接地址,昨天咱们是<router-link :to="'/content/' + ...

  9. 【odoo12填坑日记】field.selection引号使用规范

    odoo12(不知道其他版本是否同样问题) 在fields.selection中的键值对中,列表中的元组中值必须是使用双引号,而不能是单引号. 可以看到,如果使用的单引号,在生成的html中 item ...

最新文章

  1. 架构师之路 — 分布式系统 — 分布式事务难题
  2. 处理错误:ORA-27101: shared memory realm does not exist
  3. 如何编写企业解决方案书(转)
  4. 1.21 Lambda表达式
  5. Linux /dev目录详解和Linux系统各个目录的作用
  6. Ajax实现异步操作实例_针对XML格式的请求数据
  7. why my CREATE_OW will not generate OSSET entry in OB buffer
  8. 双11特刊|一站式在线数据管理平台DMS技术再升级,高效护航双11
  9. java mongodb 返回所有field_Python爬虫框架:scrapy爬取知乎关注用户存入mongodb
  10. 联发科完成双模芯片实验室测试 首批5G终端明年一季度问世
  11. 启动tomcat报错,Failed to start component
  12. java html 转word_java后端实现word上传并转html格式
  13. 小团队Git协作流程
  14. VB中对数据库进行增、删、改操作
  15. 带手续费买卖股票的最大利益[找DP的状态定义到底缺什么?]
  16. 平板电脑如何刷linux,平板电脑刷windows的方法是什么_如何把平板刷windows图文步骤...
  17. ORACLE:单行函数
  18. LeetCode881. 救生艇
  19. PID微分积分电路(转载)
  20. Linux(CentOS7)中利用一个光盘制作yum源(配置yum源)

热门文章

  1. 进程之wait函数和waitpid函数
  2. android统计app流量的软件,流量控(手机流量统计)app
  3. 几张图彻底搞定Seq2Seq
  4. 删除了ppt还能恢复吗?ppt误删除怎么恢复?3个方案已解决
  5. SAP 销售订单无法在MD04显示
  6. SDN的Mininet使用
  7. onclick 常用手册
  8. Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C#)
  9. 穿越到长安,我发现了5G的影子
  10. c语言驼峰命名法作用,C语言中变量名及函数名的命名规则与驼峰命名法