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