一、基础配置
模式选择 : 配置为异步模式Asynchronous
- Asynchronous : 异步, 整个过程,不会阻碍发送者的工作。
- Synchronous : 同步, 同步信息一旦发送,发送者必须等到应答,才能继续后续的行为。
- Single Wire : 单总线, 半双工。
- Multiprocessor Communication:多机通信

基本参数配置: 参数配置里面主要关注一下基本参数配置,其他的一些配置默认即可。
- 波特率:可以根据实际情况进行选择
- 字长:一般选择8位即可
- 奇偶校验:一般选择无
- 停止位:1位

二、printf 重定向
在 Private includes 中引入头文件:
#include
在 USER CODE BEGIN PD 添加下面代码:
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *F)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
使用printf输出浮点数:
Project–>Properties–>C/C++ Build–>Settings–>MCU settings,如下图所示,勾选上即可。

实验一:通过串口发送数据
- 基本配置

- 添加代码:
/* USER CODE BEGIN Includes */
#include
/* USER CODE END Includes */
/* USER CODE BEGIN PD */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *F)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END PD */
/* USER CODE BEGIN 3 */
HAL_Delay(500);
printf("Hello World!rn");
}
/* USER CODE END 3 */
- 实验现象:
打开串口调试助手,即可看将以500ms为周期输出Hello World!

实验二:接收数据
- 基本配置:注意需要开启串口中断


- 添加代码:
/* USER CODE BEGIN Includes */
#include
/* USER CODE END Includes */
/* USER CODE BEGIN PD */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *F)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint8_t RxBuff[1]; // 用来接收串口2发送的数据
/* USER CODE END PV */
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart2, RxBuff, 1);
/* USER CODE END 2 */
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART2) // 判断是由哪个串口触发的中断
{
HAL_UART_Transmit(&huart2,RxBuff,1,100); // 接收到数据马上使用串口2发送出去
HAL_UART_Receive_IT(&huart2,RxBuff,1); // 重新使能串口2接收中断
}
}
/* USER CODE END 4 */
4 */ 实验现象: 将串口接收到的数据,又通过该串口发送回去

实验三:串口接收不定长数据(定时器方式实现)
- 基本配置:
关于定时器的配置,在这里使用通用定时器3。如下图所示,配置一下时钟,内部时钟我们配置为64Mhz,定时器1ms产生一次中断(可以根据实际情况增大时间)。
定时器的配置主要有两个:定时时间与是否重装定时器。
定时频率 = 定时器时钟 / (预分频 +1) /(计数值 + 1 ) Hz。
定时时间 = 1 / 定时频率 s。




添加代码:
/* USER CODE BEGIN Includes */
#include
#include
/* USER CODE END Includes */
/* USER CODE BEGIN PD */
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch,FILE *F)
#endif
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
return ch;
}
/* USER CODE END PD */
/* USER CODE BEGIN PV */
uint8_t RxBuff[1]; //进入中断接收数据的数组
uint8_t DataBuff[100]; //保存接收到的数据的数组
int RxLine=0; //接收到的数据长度
int Rx_flag=0; //接受到数据标志
/* USER CODE END PV */
/* USER CODE BEGIN 0 */
void printf_usart(void)
{
printf("length=%drn",RxLine);
DataBuff[RxLine] = '