tgqoholu 发表于 2025-8-2 14:25:11

printf_usb 丢包,大神求解

主函数测试,i++前面明显丢了一截,printf_usb后面加延时明显能改善,但延时要加几百个ms才行。
        for(i=0;i<100;i++)

        {
                printf_usb("%d",i);

        }


接收←464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899

ercircle 发表于 2025-8-2 14:59:15

使用sprintf将字符串格式化到buffer中一次发送,一个字节一个字节发送太浪费带宽。

可使用Usb_SendData发送buffer,
或者printf("%s",pstr);发送字符串。

vb2002 发表于 2025-8-2 18:35:06

我在读完ADC也是打印出现乱码,然后我加了10ms的延迟就好了.

DebugLab 发表于 2025-8-2 22:14:12

猜测是这样的,printf写入buffer,然后中断和硬件在后台发送,如果发送速度大于后台处理速度,就会阻塞,猜的,不一定对
还有个问题就是要等待USB配置完毕再开始发送,上电直接运行这个for循环,USB可能还没配置完毕
我写的串口程序就是这样的,上一个数据包没发完,可以等待,也可以丢弃
https://www.stcaimcu.com/thread-16321-1-1.html
https://www.stcaimcu.com/thread-4598-1-1.html



tgqoholu 发表于 2025-8-4 11:14:10

ercircle 发表于 2025-8-2 14:59
使用sprintf将字符串格式化到buffer中一次发送,一个字节一个字节发送太浪费带宽。

可使用Usb_SendData发 ...

sprintf 一样是会丢包。只能放到for循环里面,前面丢一点包后面就正常了。

ercircle 发表于 2025-8-4 11:25:45

tgqoholu 发表于 2025-8-4 11:14
sprintf 一样是会丢包。只能放到for循环里面,前面丢一点包后面就正常了。
...

sprintf不是发送函数,只是格式化打印到buffer里,发还是printf。
“前面丢一点包”,是等USB配置完成并且串口打开后再发送吗,改成上位机发个字母再开始发对比下?
丢包一个是发送速率控制在带宽内,一个是可以建立ACK机制和重传机制。

tgqoholu 发表于 2025-8-4 11:43:15

ercircle 发表于 2025-8-4 11:25
sprintf不是发送函数,只是格式化打印到buffer里,发还是printf。
“前面丢一点包”,是等USB配置完成并 ...

用上位机发消息,再接收printf,这种方法可以解决问题,谢谢。
页: [1]
查看完整版本: printf_usb 丢包,大神求解