咚了个咚 发表于 2025-6-8 23:07

printf在大量打印时会丢失一些数据

使用nucleo-H473 ZI 2与CubeIDE。当我打印一个1024长的int数组时,SWV ITM数据控制台不会输出所有1024个值。总会丢失一些数据。以下是程序int _write(int file, char *ptr, int len){/* Implement your write code here, this is used by puts and printf for example */int i=0;for(i=0 ; i<len ; i++)    ITM_SendChar((*ptr++));return len;}然后我打印出数组中的所有值:int print_array;for(int i=0; i<1024; i++){          print_array = i;}printf("Hello World!\n");//Print out array valuesfor(int i=0; i<1024; i++){          printf("%d, \n", i);          HAL_Delay(5);}HAL_Delay(1000);//Print some more to make sure all data is finished printingfor(int i=0; i<2; i++){          printf("Hello World\n");          HAL_Delay(5);}HAL_Delay(100);   while(1);但是在SWV ITM数据控制台中得到的结果只包含大约900个数字,而不是1024个数字。数量也在波动。为什么会发生这种情况,是否有办法避免?

xiaoqizi 发表于 2025-7-6 21:45

printf 函数内部使用缓冲区,若数据量过大或发送速率慢于数据生成速度,缓冲区可能溢出或未及时清空,导致数据丢失。

木木guainv 发表于 2025-7-7 09:22

若 printf 的串口中断优先级较低,可能在执行过程中被其他高优先级中断打断,导致数据传输不完整

Jiangxiaopi 发表于 2025-7-7 11:50

浮点数在二进制转换中可能丢失精度,导致打印值异常

荣陶陶 发表于 2025-7-7 14:12

若 printf 的串口中断优先级较低,可能在执行过程中被其他高优先级中断打断,导致数据传输不完整

Zhiniaocun 发表于 2025-7-7 16:33

波特率过低或数据量过大,导致串口无法及时发送所有数据

Zuocidian 发表于 2025-7-7 19:03

串口线过长、电平转换电路缺失或硬件故障,导致信号衰减或噪声干扰

Puchou 发表于 2025-7-7 21:19

修改 __io_putchar() 函数,使用非阻塞方式发送数据

Xiashiqi 发表于 2025-7-8 07:43

替换 float 为 double,提高精度

小海师 发表于 2025-7-8 09:59

将大数据拆分为小块,分批次发送

Haizangwang 发表于 2025-7-8 12:16

确保串口中断优先级最高,避免被其他中断抢占。
页: [1]
查看完整版本: printf在大量打印时会丢失一些数据