底层原理
printf()的底层
如果大家C语言学的不错的话,应该会知道printf()的底层调用了 fputc( )。是有fputc()来向屏幕中打印数据的。
scanf()的底层
scanf()的底层就是fgetc(),用它来一个一个读取字符。
如何重定向
上面,我们既然已经知道printf(),scanf()的底层函数fputc(),fgetc(),那我们是否可以改写fputc(),fgetc()使之向串口,显然这是可行的。
改写fputc(),fgetc()
代码如下(自己写的,仅供参考)
可复制版
int fputc(int ch,FILE* fp) { UNUSED(fp); if(HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,HAL_MAX_DELAY)==HAL_OK) { return ch; } return EOF; } int fgetc(FILE* fp) { uint8_t ch=0; UNUSED(fp); while (1) { if (HAL_UART_Receive(ghuart, &ch, 1, HAL_MAX_DELAY) != HAL_OK) { return EOF; } if (ch != 'r') { return (int)ch; } } return EOF; }注意:fgetc()这里,我跳过了“ r”字符,不读取它。
这两个函数不用作前置声明,直接定义了即可
COMTOOL工具
有的老铁可能还不知道怎么用windows充当上位机和MCU通信,我自己用的是COMTOOL工具
下载链接:https://sourceforge.net/projects/comtool/
界面如下图
烧录后没反应怎么办?
这是很多新手老铁都会犯的错误,原因是没对Keil进行配置。
点开魔术棒
点击Target,勾选Use MicroLIB。记得点OK,不要直接X掉并且 要重新编译后烧录