1 第一种方法
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#define GETCHAR_PROTOTYPE int __io_getchar(FILE *f)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#define GETCHAR_PROTOTYPE int fgetc(FILE *f)
#endif
//HAL库
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart3, (uint8_t*)&ch, 1, HAL_MAX_DELAY);
return ch;
}
GETCHAR_PROTOTYPE
{
uint8_t ch;
HAL_UART_Receive(&huart3,(uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
//寄存器
PUTCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_TC) == RESET);
USART3->TDR=(uint8_t)ch;
return ch;
}
GETCHAR_PROTOTYPE
{
while((USART3->ISR & UART_FLAG_RXNE) == RESET);
return (uint8_t)(USART3->RDR);
}
注意:printf()和scanf()都是用轮询方式,没有使用中断。调用scanf()在串口助手中输入数据时,必须以空格结束(换行也是可行的,原因还没弄清),然后点击发送,否则无法完成发送。
2 第二种方法
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
return ch;
}
/**
* 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* 输入参数: 无
* 返 回 值: 无
* 说 明:无
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
return ch;
}
3 注意事项
3.1 注意事项1
在keil中将这个选项勾选上
3.2 注意事项2
在需要使用printf和scanf处添加头文件<stdio.h>
3.3 注意事项3
需要使用哪一个串口,就将串口进行更改