Skip to content

UART 使用 ​

波特率和信号频率的关系

9600 波特率
115200 GPIO翻转速度

串口芯片一般有如下图所示的串口模块,我这边就是直接做在板子上的 alt text

1. 硬件连接 ​

这个原理图是选用了 CH340N 作为串口传输的芯片,

alt text

2. CubeMX生成代码 ​

外部晶振配置 ​

alt text

SWD接口配置 ​

如果不配置,会导致之后无法下载代码,请一定注意!! alt text

串口的代码配置 ​

alt text

时钟配置 ​

alt text

工程配置 ​

需要注意的是,工程中都不能有中文的字符,否则有可能导致无法生成代码,或者keil debug的时候出现卡死的情况,

alt text

alt text

3. 编写代码 ​

串口的重定向,函数代码,如果你使用的不是串口1 ,则需要修改串口信息

C
/* USER CODE BEGIN 0 */
#include <stdio.h>
 //重定向c库函数printf到串口USARTx,重定向后可使用printf函数
 int fputc(int ch, FILE *f)
 {
     /* 发送一个字节数据到串口USARTx */
     HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
     return (ch);
 }

 //重定向c库函数scanf到串口USARTx,重写向后可使用scanf、getchar等函数
 int fgetc(FILE *f)
 {
     int ch;
     /* 等待串口输入数据 */
     while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == RESET);
     HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
     return (ch);
 }

  void ShowHex(uint8_t *buf,uint8_t len)
{
    uint8_t i;
    printf("hex = ");
    for( i = 0; i < len; i++){
        printf(" %02X",buf[i]); //使用前导0补齐
        //printf(" %2X",buf[i]);  //使用前导空格补齐
        //printf(" %X",buf[i]);  //输出最短的16进制格式
    }
    printf( "\r\n");
}

/* USER CODE END 0 */

串口实现收发一个函数的代码

C

  while (1)
  {
    /* USER CODE END WHILE */
        uint8_t ch[10];
        /* 等待串口输入数据 */
        while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) == RESET);
        HAL_UART_Receive(&huart1, (uint8_t *)&ch, 10, 0x2F);
        printf("接收到字符:%s \r\n",ch);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

4. 后记 ​

alt text