Keil5怎么解决printf语句打印空白问题
很多刚接触keil5开发arm单片机尤其是stm32的开发者,大概率会遇到一个比较头疼的问题:写好了printf串口打印代码,下载到硬件运行后,串口助手却一直输出空白,明明代码看起来没什么问题,却始终看不到打印信息。其实这个问题大部分都是配置错误导致的,我们可以按步骤逐一排查解决。

keil5默认的printf函数是针对标准输出流的,单片机没有pc端的标准输出,所以必须手动重定向fputc函数到单片机的串口。很多新手容易在这里出错:要么是重定向代码写错,比如函数名拼写错误、返回值错误,要么是错把重定向写到了错误的文件中,导致编译器没有识别到自定义的fputc。正确的重定向应该是把fputc绑定到单片机的串口发送函数,比如使用hal库开发时,正确写法应该是重定向fputc调用hal_uart_transmit发送单字节,确保每个printf输出的字符都能通过串口正常发出去。
关闭半主机模式或启用微库解决问题不少开发者重定向代码写对了,还是打印空白,问题就出在半主机模式上。keil5默认启用半主机模式,这种模式是给仿真调试场景用的,实际硬件运行时无法正常输出,所以必须修改配置。最简单的解决方法是启用微库:打开keil5的「option for target」,进入target选项卡,勾选「use microlib」,重新编译下载就可以正常打印了。如果不想使用微库,也可以在代码中手动关闭半主机模式,添加`pragma import(__use_no_semihosting)`语句,同时重定义_sys_exit等系统函数避免链接报错,这样不用微库也能正常输出。

如果前面两项配置都没问题,还是打印空白,就要排查硬件和基础配置问题:首先检查串口波特率、停止位等参数和串口助手的配置是否一致,单片机时钟配置错误会导致波特率偏差,最终完全收不到正确数据;其次检查串口tx引脚的gpio配置是否正确,有没有把tx错设成输入模式;另外还要检查代码逻辑,比如待打印的字符串是否缺了结束符'⁄0',有没有因为程序运行过快,printf输出还没刷新缓冲区就进入阻塞循环,可以尝试在printf后添加`fflush(stdout)`强制刷新缓冲区,解决这类隐性问题。

大部分printf打印空白的问题,都可以通过以上三步排查解决,多数情况下都是忘记勾选微库或者重定向代码错误,新手遇到这类问题不用慌,按步骤排查就能快速定位解决,整个过程也能帮助开发者加深对keil5编译链接机制的理解。
相关文章:

网公网安备