STM32F103RCT6学习之三:串口

1.串口基础

2.串口发送

1)基本配置

注意:实现串口通信功能需在keil中设置打开Use Micro LIB,才能通过串口助手观察到串口信息

2)编辑代码

cpp 复制代码
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  uint8_t msg[]="Hello World!\n";
  while (1)
  {
    /* USER CODE END WHILE */
		HAL_UART_Transmit(&huart1,msg,sizeof(msg),HAL_MAX_DELAY);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3)分析 ---关于重定向

huart1是一个串口句柄,定义在usart.c中

如果重定向printf或sprintf,只需要重定义fputc和fgetc()

cpp 复制代码
#include<stdio.h>
int fputc(int ch,FILE *f){
	
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);
	
	return ch;
}
int fgetc(FILE  *f){
	uint8_t ch;
	HAL_UART_Receive(&huart1,(uint8_t*)&ch,1,0xffff);
	return ch;
}

那么主函数可以如下实现::

cpp 复制代码
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		printf("Hello World\t\n");
		HAL_Delay(500);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

**吐槽一下,显示"%"只能用下面的方法

cpp 复制代码
printf("%%");
printf("%c",'%');

3.串口接收与发送

1)进行基本配置

除了上述配置外,加入中断

2)编辑代码

触发中断时系统会调用定义于stm32f1xx_it.c的void USART1_IRQHandler(void)

可以看到该中断服务函数又调用 HAL_UART_IRQHandler(&huart1),该函数定义于stm32f1xx_hal_uart.c中:

在传输模式下,该函数调用 UART_Receive_IT(huart);该函数同样定义于stm32f1xx_hal_uart.c中,该函数调用可重定义函数 HAL_UART_RxCpltCallback(huart);并重定向printf及sprintf

cpp 复制代码
#include<stdio.h>
int fputc(int ch,FILE *f){
	
	HAL_UART_Transmit(&huart1,(uint8_t*)&ch,1,0xffff);
	
	return ch;
}
int fgetc(FILE  *f){
	uint8_t ch;
	HAL_UART_Receive(&huart1,(uint8_t*)&ch,1,0xffff);
	return ch;
}
#define RX_BUFFER_SIZE 50
uint8_t rxBuffer[RX_BUFFER_SIZE];//发送缓冲区
uint8_t rxData; //单字节接收数据
uint8_t txBuffer[RX_BUFFER_SIZE+10];//发送还出去
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART1) // 检查是否为 USART1
    {
        static uint16_t rxIndex = 0;

        // 保存接收到的字节到缓冲区
        if (rxIndex < RX_BUFFER_SIZE - 1)  //确保不会写入超过缓冲区边界的位置
        {
            rxBuffer[rxIndex++] = rxData;

            // 如果接收到换行符(表示消息结束)
            if (rxData == '\n')
            {
                rxBuffer[rxIndex] = '\0'; // 添加字符串结束符

                // 拼接前缀并发送数据
                sprintf((char *)txBuffer, "STM32 Received: %s", rxBuffer);
               	printf("%s", txBuffer);

                rxIndex = 0; // 重置接收缓冲区索引
            }
        }

        // 继续接收下一个字节
        HAL_UART_Receive_IT(&huart1, &rxData, 1);
    }
}
cpp 复制代码
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart1, &rxData, 1);  //开启接收中断   参数为串口句柄、数据存储地址、接收字节数
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	//uint8_t msg[]="Hello World!\t\n";
	printf("Hello World!\t\n");
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

3)分析

HAL_UART_Receive_IT()很有趣?!不要忘了加!两处!

相关推荐
lingggggaaaa38 分钟前
免杀对抗——C2远控篇&C&C++&DLL注入&过内存核晶&镂空新增&白加黑链&签名程序劫持
c语言·c++·学习·安全·网络安全·免杀对抗
陈天伟教授1 小时前
基于学习的人工智能(5)机器学习基本框架
人工智能·学习·机器学习
我先去打把游戏先1 小时前
ESP32学习笔记(基于IDF):基于OneNet的ESP32的OTA功能
笔记·物联网·学习·云计算·iphone·aws
初願致夕霞2 小时前
学习笔记——基础hash思想及其简单C++实现
笔记·学习·哈希算法
刻BITTER2 小时前
用EXCEL 将单色屏幕的Bitmap 字模数据还原回图形
单片机·嵌入式硬件·excel·arduino
小女孩真可爱2 小时前
大模型学习记录(五)-------调用大模型API接口
pytorch·深度学习·学习
hd51cc2 小时前
C++ 学习笔记 名称
笔记·学习
撬动未来的支点4 小时前
【嵌入式】MCU和MPU的区别
单片机·嵌入式硬件
cmcm!4 小时前
学习笔记1
数据库·笔记·学习
一支闲人4 小时前
CAN:STM32 CAN外设2
stm32·单片机·基础知识·can协议·stm外设