ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

USART重定向——利用printf,scanf向上位机输出输入信息

USART重定向——利用printf,scanf向上位机输出输入信息

底层原理

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掉并且 要重新编译后烧录

返回列表