当前位置: 首页 > news >正文

【蓝桥杯嵌入式】UART(收发)

全部代码网盘自取

链接:https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd=3ii2 
提取码:3ii2

1、电路图

2、Cube配置

打开PA9、10串口

选择异步模式,并根据题目要求设置串口波特率,一般要求设置为9600

打开串口中断

3、串口收发函数

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

用于以中断方式接收数据。当UART接收到数据时,硬件中断被触发,允许CPU处理其他任务。这种方式适用于需要快速响应或同时执行多个任务的场景。

  • UART_HandleTypeDef *huart: UART句柄,指向一个初始化过的UART配置结构体。
  • uint8_t *pData: 数据缓冲区指针,用于存储接收到的数据。
  • uint16_t Size: 要接收的数据长度。

HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

用于以阻塞方式接收数据。函数调用后,CPU将等待直到接收到指定数量的数据或超时。这种方式简单易用,但会阻塞CPU,直到数据接收完成。

  • UART_HandleTypeDef *huart: UART句柄。
  • uint8_t *pData: 数据缓冲区指针。
  • uint16_t Size: 要接收的数据长度。
  • uint32_t Timeout: 接收超时时间,单位为毫秒。

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)

用于以中断方式发送数据。当UART发送缓冲区为空时,硬件中断被触发,允许CPU在等待发送数据的同时处理其他任务。

HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)

用于以阻塞方式发送数据。函数调用后,CPU将等待直到所有数据发送完毕或超时。这种方式确保了数据的发送,但会阻塞CPU。

4、sizeofstrlen

关于上面这些函数在确定要接收的数据长度时用sizeof还是strlen问题:(其实都可以,影响不大)

Strlen

  • 当处理的是文本字符串,并且需要根据字符串的实际长度(不包括结尾的空字符'\0')来发送或接收数据时,使用strlen。
  • strlen返回的是字符串的长度,直到遇到第一个空字符为止。
  • 适用于发送或接收以空字符结尾的文本字符串。

Sizeof

  • 当需要发送或接收固定大小的数据缓冲区时,使用sizeof来确定整个缓冲区的大小。
  • sizeof返回的是数据类型或变量在内存中所占的总字节数,不受数据内容的影响。
  • 适用于发送或接收固定大小的数据块,如数组、结构体等。

5、代码

5.1 串口发送数据

main.c

#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
#include "string.h"
void SystemClock_Config(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */char temp[10];int a=666;float b=666.666;char c='6';char d[]="66666666";/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE */sprintf(temp,"%d\r\n",a);HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);sprintf(temp,"%.3f\r\n",b);HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);sprintf(temp,"%c\r\n",c);HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);sprintf(temp,"%s\r\n",d);HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);HAL_Delay(500);}
}

5.2 串口printf重定向

勾选Use MicroLIB指定编译器使用 MicroLIB作为标准C库否则无法使用printf.

MicroLIB是种精简版的C标准库,它比完整的 ANSI C标准库(如 NewLib 或 NewLib)占用更少的内存,这使得它非常适合资源受限的嵌入式系统。

在main.c修改

  /* USER CODE BEGIN WHILE */while (1){printf("%d\r\n",a);printf("%.3f\r\n",b);printf("%c\r\n",c);printf("%s\r\n\r\n",d);HAL_Delay(500);/* USER CODE END WHILE */}

在usart.c中增加(放在其他地方也行)

int fputc(int ch, FILE *f) 
{HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,50);return ch;
}

5.3 串口接收数据

interrupt.c

#include "interrupt.h"char rxdata[30];
uint8_t rxdat;
uchar rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收回调函数
{rxdata[rx_pointer++]=rxdat;			  //存放读取到的字符,每次存放位置自增1HAL_UART_Receive_IT(&huart1,&rxdat,1);//每次中断只能接收一个字符	
}

interrupt.h

#ifndef _INTERRUPT_H_
#define _INTERRUPT_H_#include "main.h"
#include "usart.h"
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);#endif

main.c

#include "main.h"
#include "usart.h"
#include "gpio.h"
/* USER CODE BEGIN Includes */
#include “stdio.h”
#include "interrupt.h"
void uart_pro(void);
extern uchar rx_pointer;
extern char rxdata[30];
extern uchar rx_pointer;
extern uint8_t rxdat;
/* USER CODE END Includes */
void SystemClock_Config(void);
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_IT(&huart1,&rxdat,1);  //串口接收初始化
/* USER CODE END 2 *//* USER CODE BEGIN WHILE */while (1){if(rx_pointer!=0)    //防止接收不完整{int temp=rx_pointer;HAL_Delay(1);if(temp==rx_pointer)uart_pro();}/* USER CODE END WHILE */}
}void uart_pro(void)
{if(rx_pointer>0){printf("%s",rxdata);}rx_pointer=0;memset(rxdata,0,30);     //rxdata指向的内存区域的前30个字节全部设置为0
}

 一定要记得进行串口接收初始化


http://www.mrgr.cn/news/90022.html

相关文章:

  • c++编译后的库太大了, 放不到单片机上如何编译才可以优化大小?
  • directx12 3d开发过程中出现的报错 九
  • 人工智能-A*算法与卷积神经网络(CNN)结合实现路径规划
  • [EAI-033] SFT 记忆,RL 泛化,LLM和VLM的消融研究
  • Scala 语法入门
  • WebSocket推送数据快,条数多导致前端卡顿问题解决
  • 计算机毕业设计Python+Vue.js游戏推荐系统 Steam游戏推荐系统 Django Flask 游 戏可视化 游戏数据分析 游戏大数据 爬虫
  • Centos Stream 10 根目录下的文件夹结构
  • 【HeadFirst系列之HeadFirstJava】第2天之类与对象-拜访对象村
  • OpenGL学习笔记(十二):初级光照:投光物/多光源(平行光、点光源、聚光)
  • Shapefile格式文件解析和显示
  • Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!
  • 《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》
  • 【算法】动态规划专题⑨ —— 二维费用背包问题 python
  • springboot简单应用
  • 【SQL教程|05】Mysql中Limit用法详解
  • 大疆前端开发面试题及参考答案(4万字长文)
  • 【R语言】卡方检验
  • HTML应用指南:利用GET请求获取全国盒马门店位置信息
  • 《Cherry Studio+DeepSeek+Whoosh:三剑合璧,打造高效AI知识库与全文搜索系统》
  • 【Spring】什么是Spring?
  • (六)C++的函数模板与类模板
  • camera系统之cameraprovider
  • 【CubeMX-HAL库】STM32F407—无刷电机学习笔记
  • 保研考研机试攻略:python笔记(4)
  • 【python】简单的flask做页面。一组字母组成的所有单词。这里的输入是一组字母,而输出是所有可能得字母组成的单词列表