USB_CDC 使用Printf遇到丢数问题
本帖最后由 晓飛飛 于 2024-11-18 15:53 编辑使用如下代码50ms发送一次数据,在串口调试助手里面发现偶有丢失字符的现象,不知如何优化,在USB发送期间关闭全局中断都解决不了丢数据问题。
printf("%02bx-%02bx-%02bx,%02bx:%02bx:%02bx,",ALS_con_buf.date,ALS_con_buf.date,ALS_con_buf.date,ALS_con_buf.date,ALS_con_buf.date,ALS_con_buf.date);
for(n=0;n<10;n++) printf("%ld,%ld,",ALS_con_buf.ALS_data.ALS,ALS_con_buf.ALS_data.TSI);
printf("%u\r\n",ALS_con_buf.count);
数据是否被打断或覆盖
降低发送数据频率试试
不要在中断里用printf 单独做了个测试代码,没有其它干扰因素,也出现丢数据现象
void Timer2_Isr(void) interrupt 12
{
static u16 count=0;
long aa = 11111;
if(count++ > 50)
{
count=0;
printf("%ld,%ld,",aa,aa);
printf("%ld,%ld,",aa,aa);
printf("%ld,%ld,",aa,aa);
printf("%ld,%ld,",aa,aa);
printf("%ld,%ld\n",aa,aa);
}
}
void Timer2_Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xCD; //设置定时初始值
T2H = 0xD4; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
IE2 |= 0x04; //使能定时器2中断
}
DebugLab 发表于 2024-11-18 16:07
数据是否被打断或覆盖
降低发送数据频率试试
不要在中断里用printf
楼主位那个代码是在主程序流程里面使用Printf的,不在中断里面,而且我也测试了暂时关闭全局中断的方式做数据发送还丢数据,至于降低发送数据频率,这个是需要怎么计算不丢数据的安全发送间隔。
我这个代码的目的是为了实现小存储器里面的数据通过文本格式输出,直接在串口助手里面存为csv文件,便于导入excel查看曲线趋势,希望传输速度越快越好,如果每包数据都需要大延迟的话,就失去了实用价值。 晓飛飛 发表于 2024-11-18 16:13
楼主位那个代码是在主程序流程里面使用Printf的,不在中断里面,而且我也测试了暂时关闭全局中断的方式做 ...
发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 1,串口用最高优先级;2,有 DMA的用上DMA 神农鼎 发表于 2024-11-18 16:15
1,串口用最高优先级;2,有 DMA的用上DMA
您好,用的8H8K64U,USB接口虚拟串口,官方USB CDC库, DebugLab 发表于 2024-11-18 16:14
发数据之前需要检查上一个包发完了没有,如果没发完,等待上一个包发完 ...
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=4598
CDC也是类似的
晓飛飛 发表于 2024-11-18 16:19
您好,用的8H8K64U,USB接口虚拟串口,官方USB CDC库,
https://www.stcaimcu.com/forum.php?mod=viewthread&tid=9938
我这个用的也是CDC库,没出现过错误
printf是不可重入函数,一般在主循环调用,中断里不要调用了
你这情况只有调用printf前关中断救才行
页:
[1]
2