找回密码
 立即注册
查看: 1177|回复: 17

USB_CDC 使用Printf遇到丢数问题

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 15:49:51 | 显示全部楼层 |阅读模式
本帖最后由 晓飛飛 于 2024-11-18 15:53 编辑

使用如下代码50ms发送一次数据,在串口调试助手里面发现偶有丢失字符的现象,不知如何优化,在USB发送期间关闭全局中断都解决不了丢数据问题。

  1. printf("%02bx-%02bx-%02bx,%02bx:%02bx:%02bx,",ALS_con_buf.date[0],ALS_con_buf.date[1],ALS_con_buf.date[2],ALS_con_buf.date[3],ALS_con_buf.date[4],ALS_con_buf.date[5]);
  2. for(n=0;n<10;n++)   printf("%ld,%ld,",ALS_con_buf.ALS_data[n].ALS,ALS_con_buf.ALS_data[n].TSI);         
  3. printf("%u\r\n",ALS_con_buf.count);        
复制代码

QQ20241118-154443.png QQ20241118-154051.png

睁开眼睛做场梦~~~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 16:07:32 | 显示全部楼层
数据是否被打断或覆盖
降低发送数据频率试试
不要在中断里用printf

点评

楼主位那个代码是在主程序流程里面使用Printf的,不在中断里面,而且我也测试了暂时关闭全局中断的方式做数据发送还丢数据,至于降低发送数据频率,这个是需要怎么计算不丢数据的安全发送间隔。 我这个代码的目的是  详情 回复 发表于 2024-11-18 16:13
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 16:07:56 | 显示全部楼层
单独做了个测试代码,没有其它干扰因素,也出现丢数据现象
  1. void Timer2_Isr(void) interrupt 12
  2. {
  3.         static u16 count=0;
  4.         long aa = 11111;
  5.         if(count++ > 50)
  6.         {
  7.                 count=0;
  8.                 printf("%ld,%ld,",aa,aa);
  9.                 printf("%ld,%ld,",aa,aa);
  10.                 printf("%ld,%ld,",aa,aa);
  11.                 printf("%ld,%ld,",aa,aa);
  12.                 printf("%ld,%ld\n",aa,aa);               
  13.         }
  14. }
  15. void Timer2_Init(void)                //1毫秒@11.0592MHz
  16. {
  17.         AUXR |= 0x04;                        //定时器时钟1T模式
  18.         T2L = 0xCD;                                //设置定时初始值
  19.         T2H = 0xD4;                                //设置定时初始值
  20.         AUXR |= 0x10;                        //定时器2开始计时
  21.         IE2 |= 0x04;                        //使能定时器2中断
  22. }
复制代码





睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 16:13:22 | 显示全部楼层
Debu*** 发表于 2024-11-18 16:07
数据是否被打断或覆盖
降低发送数据频率试试
不要在中断里用printf

楼主位那个代码是在主程序流程里面使用Printf的,不在中断里面,而且我也测试了暂时关闭全局中断的方式做数据发送还丢数据,至于降低发送数据频率,这个是需要怎么计算不丢数据的安全发送间隔。
我这个代码的目的是为了实现小存储器里面的数据通过文本格式输出,直接在串口助手里面存为csv文件,便于导入excel查看曲线趋势,希望传输速度越快越好,如果每包数据都需要大延迟的话,就失去了实用价值。

点评

发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完  详情 回复 发表于 2024-11-18 16:14
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 16:14:38 | 显示全部楼层
晓*** 发表于 2024-11-18 16:13
楼主位那个代码是在主程序流程里面使用Printf的,不在中断里面,而且我也测试了暂时关闭全局中断的方式做 ...

发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完

点评

所以,我在发送前加了一句 while(bUsbInBusy) ,亲测有效,看来Printf发送还是挺慢的,比USB_SendData慢得多的多。  详情 回复 发表于 2024-11-18 16:52
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598 [attachimg]64287[/attachimg] CDC也是类似的  详情 回复 发表于 2024-11-18 16:22
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:55
  • 最近打卡:2025-05-02 08:32:59

717

主题

1万

回帖

1万

积分

管理员

积分
15617
发表于 2024-11-18 16:15:25 | 显示全部楼层
1,串口用最高优先级;2,有 DMA的用上DMA

点评

您好,用的8H8K64U,USB接口虚拟串口,官方USB CDC库,  详情 回复 发表于 2024-11-18 16:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-11-18 16:19:40 | 显示全部楼层
神*** 发表于 2024-11-18 16:15
1,串口用最高优先级;2,有 DMA的用上DMA

您好,用的8H8K64U,USB接口虚拟串口,官方USB CDC库,

点评

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=9938 我这个用的也是CDC库,没出现过错误  详情 回复 发表于 2024-11-18 16:25
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 16:22:21 | 显示全部楼层
Debu*** 发表于 2024-11-18 16:14
发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 ...


https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598

截图202411181616137968.jpg

CDC也是类似的
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-11-18 16:25:24 | 显示全部楼层
晓*** 发表于 2024-11-18 16:19
您好,用的8H8K64U,USB接口虚拟串口,官方USB CDC库,

https://www.stcaimcu.com/forum.php?mod=viewthread&tid=9938

我这个用的也是CDC库,没出现过错误
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2024-11-18 16:41:33 | 显示全部楼层
printf是不可重入函数,一般在主循环调用,中断里不要调用了
你这情况只有调用printf前关中断救才行

点评

是的,我觉得也是printf重入问题  详情 回复 发表于 2024-11-18 17:04
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 08:46 , Processed in 0.670153 second(s), 115 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表