最详细STM32,cubeMX串口发送,接收数据

news2024/11/26 5:36:18

这篇文章将详细介绍 串口 发送数据,接受数据。

文章目录

  • 前言
  • 一、串口的基础知识
  • 二、cubeMX 配置
  • 三、自动生成代码解析
  • 四、串口发送数据函数
  • 五、使用串口收发数据点亮 led
      • 重定向函数:
  • 总结


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:了解 串口的基础知识,掌握串口如何发送,接收数据 。
  • 实验:串口发送数据点亮 led。

一、串口的基础知识

如果想了解串口的基础知识可以参考我之前的文章:
STM32Cube串口USART发送接收数据
STM32CubeMX串口USART中断发送接收数据

二、cubeMX 配置

  1. 选择芯片,开始创建工程。
    在这里插入图片描述
  2. 设置 仿真。
    在这里插入图片描述
  3. 配置时钟,选择 HSE, 高速时钟。
    在这里插入图片描述
  4. 设置时钟频率。
    直接设置为 最大频率 72 ,然后双击 enter 即可。
    在这里插入图片描述
  5. 设置工程的名字,工具链选择 MDK。
    在这里插入图片描述
  6. 点击自动生成 .c / .h 文件。
    在这里插入图片描述
  7. 这里我使用串口2 ,USART2。然后选择异步模式。
    对于 USART2 可以是 同步也可以是异步。而 UART 只可以是 同步。
    在这里插入图片描述
  8. 点击 NVIC, 使能中断。在这里插入图片描述
  9. 设置 相关参数(波特率,数据长度,校验位,停止位)
    在这里插入图片描述
  10. 可以看到这里出现了两个 PA2, PA3 引脚,分别是 发送引脚,接收引脚。
    在这里插入图片描述
  11. 点击生成即可。
    这样就可以生成 keil 的工程文件。
    在这里插入图片描述

三、自动生成代码解析

使用 cubeMX 生成的 串口代码都放在 usart.c 中。

  1. 首先还是 先定义一个 串口对象,这是一个结构体。

  2. 初始化这个结构体中的相关参数。然后调用 HAL_UART_Init(&huart2) 对其初始化。

  3. 之后自动调转到HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) 执行。

  4. __HAL_RCC_USART2_CLK_ENABLE(); 开启串口 2
    由于 PA2, PA3 引脚,所以使用 __HAL_RCC_GPIOA_CLK_ENABLE();使能 gpio 端口。

  5. 配置引脚:
    这里 PA2 作为复用引脚(除了作为串口发送端,可能还具有其他的功能),它的工作模式 是GPIO_MODE_AF_PP复用推挽输出。

  6. HAL_NVIC_SetPriority(USART2_IRQn, 0, 0) 设置优先级
    HAL_NVIC_EnableIRQ(USART2_IRQn); 使能中断

在这里插入图片描述
在这里插入图片描述

四、串口发送数据函数

  1. 发送数据。串口发送数据有 2 种写法。(有无中断)

这里我主要介绍最后一个参数 超时时间 Timeout 。 当使用这个函数 发送数据时,如果超过该时间,则直接返回错误,不再执行该函数。

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

以中断的方式发送数据。这里就不需要超时时间了。

HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size)
  1. 接收数据。
  • 开启串口中断接收函数:
    每次接收到数据后,都要再次开启中断接收函数。这样才可以多次接收数据
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
  • 串口中断接收回调函数:
    当接收到数据时,就会调用该函数。
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)

五、使用串口收发数据点亮 led

这里如果要点亮 led ,要在cubeMX 中配置 led 引脚。

uint8_t rx_buff = 0;									// 存放接收的数据


/* 每次接收到数据后都会调用该串口回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart == &huart2)
	{
		if(rx_buff == 0xa1)											// 发送 a1 点亮 led
		{
			printf("LED ON\r\n");								// 使用 printf 发送数据,需重定向 fputc 函数
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
		}
		else if(rx_buff == 0xa2)									// 发送 a2 熄灭 led
		{
			printf("LED OFF\r\n");
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
		}
	}
	
	HAL_UART_Receive_IT(&huart2,&rx_buff,1);							// 再次开启接收
}

重定向函数:

发送数据,可使用 printf
由于 printf 依赖于 fputc 函数,所以可以重定向 fputc 来实现 printf 串口发送数据。

int fputc(int ch, FILE* f)
{
	while(HAL_UART_Transmit(&huart2,(uint8_t*)&ch,sizeof(ch)-1,300) != HAL_OK);
	return 0;
}

接收数据可以使用 scanf

int fgetc( FILE *f)       /* scanf 输入 */
{
	char c = 0;
	while(HAL_UART_Receive(&huart1, (uint8_t *)&c, 1, 300) != HAL_OK);
	return c;
}


总结

下一篇文章为大家介绍 STM32 超声波 模块的使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1122558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言用json解析库(jansson)检测字符串是否是json格式的数据

C语言检测字符串是否是json格式的数据,可以用jansson库检测,也可以用cjson库来校验。但是若数据格式有问题,jansson可以指出哪里有错误,cjson无法指出。 下面就演示C语言如何使用jansson库检测字符串是否是json格式的数据。 1.下载…

pow函数

pow函数 pow的翻译是指数表达式 第一个参数为底数&#xff0c;第二个参数为指数 返回值为&#xff1a; 头文件为include <math.h> #include <stdio.h> #include <math.h>int main() {int ret (int)pow(10, 2);printf("%d\n", ret);return 0; }…

算法、语言混编、分布式锁与分布式ID、IO模型

一、算法初识 数据结构和算法是程序的基石。我们使用的所有数据类型就是一种数据结构&#xff08;数据的组织形式&#xff09;&#xff0c;写的程序逻辑就是算法。 算法是指用来操作数据、解决程序问题的一组方法。 对于同一个问题&#xff0c;使用不同的算法&#xff0c;也…

C++笔记之初始化二维矩阵的方法

C笔记之初始化二维矩阵的方法 —— 2023年5月20日 上海 code review! 文章目录 C笔记之初始化二维矩阵的方法一.常见方法1. 使用数组2. 使用向量3. 使用数组的动态分配4. 使用嵌套的 std::vector 并使用resize方法5. 初始化固定大小的 std::array 二.C中使用vector初始化二维矩…

Python基础入门例程3-NP3 读入字符串

描述 小白正在学习Python&#xff0c;从变量输出开始。请使用input函数读入一个字符串&#xff0c;然后将其输出。 输入描述&#xff1a; 输入一行字符串。 输出描述&#xff1a; 将读入的变量输出。 示例1 输入&#xff1a; Nowcoder 复制输出&#xff1a; Nowcoder…

本周技术概要20231016-20231022与生活点滴

本周包了饺子&#xff0c;辣椒油整的也不错&#xff0c;不过包饺子上升的空间还很大。 饺子美照&#xff1a; 一、linux下Qt treeView内存泄漏 当把原来Qt程序由ubuntu 32位的程序迁移到ubuntu 64位时&#xff0c;测试程序发现了内存泄漏问题&#xff0c;经过排查&#xff0c;最…

java版opencv之Javacv各种场景使用案例

文章目录 1.关于Javacv~~2. [官网下载最新OpenCV4.8](https://opencv.org/releases/)&#xff0c;并解压~~ *不一定要安装opencv*~~3. 将opencv的jar包及动态库dll文件引入项目~~4.pom引入javacv库5.测试5.1 图片美颜5.2 图片人脸检测5.3 提取视频中的语音5.4 音视频剪辑5.5 录…

Python基础入门例程2-NP2 多行输出

描述 将字符串 Hello World! 存储到变量str1中&#xff0c;再将字符串 Hello Nowcoder! 存储到变量str2中&#xff0c;再使用print语句将其打印出来&#xff08;一行一个变量&#xff09;。 输入描述&#xff1a; 无 输出描述&#xff1a; 第一行输出字符串Hello World!&a…

N——>BatchSize 数据维度理解和处理(chun, cat, squeeze, unsqueeze)

数据处理之N——>BatchSize N——>batch_size train_data TensorDataset(torch.Tensor(x_train).double(), torch.Tensor(y_train).double()) train_loader DataLoader(train_data, batch_sizeargs.bs, shuffleTrue, drop_lastTrue) for batch_idx, (inputs, results…

计算机网络第二章习题_物理层

1.用香农公式计算一下,假定信道带宽为为3100Hz,最大信道传输速率为35Kb/s ,那么若想使最大信道传输速率增加60%,问信噪比S/N应增大到多少倍?如果在刚才计算出的基础上将信噪比S/N再增大到十倍&#xff0c;问最大信息速率能否再增加20%? 问题刨析: (1)香农公式是什么? 带宽受…

css伪类元素使用技巧 表达input父级聚焦css实现

:focus-within 可以让它自己被聚焦或者它的后代元素被聚焦input 中有required 加星号在这里插入图片描述

TCP--拥塞控制

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家来访。 TCP中另一个重要的点就是拥塞控制&#xff0c;TCP是无私的当它感受到网络拥堵了&#xff0c;就…

【计算机网络】IP协议的相关特性

IP协议&#xff1a;互联网的核心组件 在当今高度数字化的世界中&#xff0c;互联网已成为人们生活、工作不可或缺的一部分。而在这个庞大的网络中&#xff0c;IP协议&#xff08;Internet Protocol&#xff09;作为核心的通信协议&#xff0c;发挥着至关重要的作用。本文将详细…

ES6有何新特性?

目录 介绍 let 和 const 解构 模板字符串 箭头函数 Set Map 介绍 ES 全称是ECMAScript&#xff0c;它是JavaScript基础构建的一种语言&#xff0c;JavaScript正是建立在ECMAScript语言的基础规范中建立使用的。ES6实际上是一个泛指&#xff0c;泛指ES2015及后续的版本…

【BP-Adaboost预测】基于BP神经网络的Adaboost的回归预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

20231022 - Day42 总结 Week06 周结

20231022 - Day42 总结 && Week06 周结 今日计划&#xff1a; 早起看JavaEE√午饭前看看复习计组√午睡前背单词√下午复习Java√晚上前跑步√晚上复习JavaEE和Java基础√睡前看英语抽空看书 今日进度&#xff1a; Java&#xff1a;上课看韩顺平老师P910&#xff0…

Linux-管道、环境变量、常用命令

文章目录 管道概念要点与文件重定向的区别 环境变量概念查看 常用命令查看系统状况权限文件查找 用户相关工具 管道 概念 管道的作用类似于文件重定向&#xff0c;可以将前一个命令的stout做为下一个命令的stdin 要点 管道命令进处理stdout&#xff0c;会忽略stderr管道右边…

【PyTorch实战演练】自调整学习率实例应用(附代码)

目录 0. 前言 1. 自调整学习率的常用方法 1.1 ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. …

Jenkins 相关内容

Jenkins 相关内容 什么是 Jenkins&#xff0c;它是如何工作的&#xff1f;Jenkins 中自由式项目和管道之间的区别什么是Jenkins管道&#xff0c;它们如何工作&#xff1f;第一次如何安装Jenkins并进行设置&#xff1f;什么是 Jenkins 插件&#xff0c;如何安装它们&#xff1f;…

中间件安全-CVE复现WeblogicJenkinsGlassFish漏洞复现

目录 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish漏洞复现中间件-Weblogic安全问题漏洞复现CVE_2017_3506漏洞复现 中间件-JBoos安全问题漏洞复现CVE-2017-12149漏洞复现CVE-2017-7504漏洞复现 中间件-Jenkins安全问题漏洞复现CVE-2017-1000353漏…