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个数字。数量也在波动。为什么会发生这种情况,是否有办法避免?printf 函数内部使用缓冲区,若数据量过大或发送速率慢于数据生成速度,缓冲区可能溢出或未及时清空,导致数据丢失。
若 printf 的串口中断优先级较低,可能在执行过程中被其他高优先级中断打断,导致数据传输不完整
浮点数在二进制转换中可能丢失精度,导致打印值异常
若 printf 的串口中断优先级较低,可能在执行过程中被其他高优先级中断打断,导致数据传输不完整
波特率过低或数据量过大,导致串口无法及时发送所有数据
串口线过长、电平转换电路缺失或硬件故障,导致信号衰减或噪声干扰
修改 __io_putchar() 函数,使用非阻塞方式发送数据
替换 float 为 double,提高精度
将大数据拆分为小块,分批次发送
确保串口中断优先级最高,避免被其他中断抢占。
页:
[1]