
一、问题现象使用STC8A系列单片机的串口打印输出功能遇到问题用printf打印输出时间戳变量时字符串可以正常打印但是时间戳变量的值一直为0串口打印显示如下图对应问题代码如下/**********************************************/ volatile u32 DelayTimeCnt 0;//时间戳变量 void main(void) { GPIO_config(); UART_config(); EA 1;//总中断使能 printf(STC8 UART4 Test Programme!\r\n); // UART4打印字符串 while(1) { delay_ms(1000); //每隔1s打印输出时间戳 printf(delaytime %6ds\r\n,DelayTimeCnt);//打印时间戳 DelayTimeCnt;//时间戳自增1 } }二、Debug排查解决问题问了豆包答复如下照着排查发现了问题根源 DelayTimeCnt 的类型 u32 的定义语句是typedef unsigned long u32; // 32 bits而问题代码错将32位的long型变量用16位的int型格式输出了所以发生了数据位丢失这里豆包说是long用%d格式化输出会发生高位丢失但我实际遇到的现象应该是低位丢失一直输出高位的0跟豆包说的相反推测可能是不同编译器的数据位对齐方式不同造成的。既然知道了问题原因bug也就迎刃而解了只需把%d换成%ld格式输出就能正常显示了如下图三、总结这个bug不是大问题但也却耗费了我不短的时间因为以前一直用的是arm单片机而非51从来没遇到过类似的问题。古人云前人栽树后人乘凉~希望本文能给踩坑的新人提供绵薄之力 o^_^o