STM32—串口

news2024/11/17 11:49:36

串口介绍

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢是设备间接线通信的一种方式数据一位一位地顺序传送双向通信,全双工传送速度相对较慢
UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信 速度,叫做波特率。对于单片机和pc之间通信,pc端用软件配置,则单片机需要用代码完成配置,也可以用波特率配置软件直接生成
在这里插入图片描述

常用函数的介绍

串口发送/接收函数:

 - HAL_UART_Transmit();//串口发送数据,使用超时管理机制
 - HAL_UART_Receiver();//串口接收数据,使用超时管理机制
 - 
 - HAL_UART_Transmit_IT();//串口中断模式发送
 - HAL_UART_Receive_IT();//串口中断模式接收
 作用:以中断的方式接收指定字节的数据
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数1:UART_HandleTypeDef 结构体类型指针变量
参数2:指向要发送的数据地址
参数3:要发送的数据大小,以字节为单位
参数4:设置的超时时间,ms为单位
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数1:UART_HandleTypeDef 结构体类型指针变量
参数2:指向接收数据缓存区
参数3:要接收的数据大小,以字节为单位
参数4:设置的超时时间,ms为单位

串口中断回调函数

void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)//串口中断处理函数
__weak void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)//发送中断回调函数
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接受中断回调函数

状态标志变量
USART_RX_STA
从0开始,串口中断接收到一个数据(一个字节)就自增1。当数据读取全部OK的时候(回车和换行符来的时候),那么USART_RX_STA的最高位置置1,表示串口数据接收全部完毕了。然后main函数里面可以处理数据了。
在这里插入图片描述

串口接收中断流程
在这里插入图片描述

串口实验(非中断)

需求:接收串口工具发送的字符串,并且将其发送回串口工具
TX——PA10 RX——PA9(交叉接线)
使用CubeMX配置工程,串口配置
1.选定串口
2.选择模式
异步通信
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
效果:在这里插入图片描述

如何使用printf打印数据到串口调试助手
1.重写fputc函数

int fputc(int ch,FILE *f)
{
	unsigned char temp[1] = {ch};
	HAL_UART_Transmit(&huart1,temp,1,0xffff);
	return ch;

2.添加#include stdio.h头文件,使用MicroLIB库
在这里插入图片描述

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		//HAL_UART_Transmit(&huart1,"hello\n",strlen("hello\n"),100);
		HAL_UART_Receive(&huart1,buff,19,100);
	//	HAL_UART_Transmit(&huart1,buff,strlen(buff),100);
	//	printf("hello wrold\n");
		printf(buff);//打印到串口调试助手
		memset(buff,0,20);//清空buff
  }
  /* USER CODE END 3 */

串口实验(中断)

需求:通过中断的方法接收串口工具发送的字符串,并将其发送回串口工具
串口配置
1.选定串口
2.选择模式
异步通信
前面步骤与上面一样
打开串口中断
在这里插入图片描述
根据中断接收流程可知,最后会在UART_Receive_IT函数中调用HAL_UART_RxCpltCallback函数,该函数为一个虚函数,我们可以在main.c中重写,接收到一个数据,就在函数中处理
在这里插入图片描述

在这里插入图片描述

//定义最大接收字节数200
#define USART_REC_LEN 200
 

//接收缓冲,串口接收到的数据放到这个数组里面,最大USART_REC_LEN字节
uint8_t UART1_RX_Buffer[USART_REC_LEN];
uint8_t buf = 0;
uint16_t USART_RX_STA = 0;

//接收完成回调函数,收到一个数据后,在这里处理
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	//1.判断中断是由哪个串口触发
	if(huart->Instance == USART1){
		//判断接收是否完成(USART_RX_STA的bit15位置为1)
		if((USART_RX_STA & 0x8000) == 0){//等于0则表示没有接收完成
			//如果收到了0x0d(回车),看bit14是否为1
			if(USART_RX_STA & 0x4000){
					//则继续判断是否收到0x0a(换行)
					if(buf == 0x0a){
						//如果0x0a和0x0d都收到,则将bit15位置置1
						USART_RX_STA |= 0x8000;
					}else {
						//否则认为接收错误,USART_RX_STA置0
						USART_RX_STA = 0;
						
					}
			}else {  //如果没有收到0x0d回车
				//先判断这个字符是否是0x0d回车
				if(buf == 0x0d){
					//是的话就将bit14置1
					USART_RX_STA |= 0x4000;
				}else {
					//不是的话,就将接收到的数据保存到缓存数组里面去
					UART1_RX_Buffer[USART_RX_STA & 0x3FFF] = buf;
					USART_RX_STA++;
					
					//如果接收数据大于USART_REC_LEN(200字节),则重新开始接收
					if(USART_RX_STA > USART_REC_LEN - 1 ){
						USART_RX_STA = 0;
						
					}
				}
				
			}
			
		}
		//重新开启中断
		HAL_UART_Receive_IT(&huart1,&buf,1);
	}
	

}

参考博文:http://t.csdn.cn/q4IPk
解释:从串口接收到的数据只有一个字节的,也就是串口是一个字节一个字节进行判断的,每次buf里面都是最新的字节,所以我们要读到一条完整的或者指定的数据长度,我们就要用UART1_RX_Buffer来存储,而USART_RX_STA就是辅助判断数据状态的。
在这里插入图片描述
两个表对应看,想要知道触发串口中断后,串口是否接收完成所有数据(0代表没有接收完成,1代表完成。)

UART1_RX_Buffer是专门存放数据的,串口接收到一个字节的数据,USART_RX_STA就会累加,UART1_RX_Buffer[USART_RX_STA]=buf就可以按顺序保存数据,但是bit15和bit14位指定进行两个判断功能,就不能拿来使用保存数据,所以我们这里&0X3FFF来截断数据。

//不是的话,就将接收到的数据保存到缓存数组里面去
UART1_RX_Buffer[USART_RX_STA & 0x3FFF] = buf;
USART_RX_STA++;				
//如果接收数据大于USART_REC_LEN(200字节),则重新开始接收
if(USART_RX_STA > USART_REC_LEN - 1 ){
		USART_RX_STA = 0;						
	}

main函数

int main(void)
{
  /* USER CODE BEGIN 1 */
	// unsigned char buff[20] = {0};
	
  /* 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,&buf,1);


  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {	
		//判断串口是否接收完成
		if(USART_RX_STA & 0x8000){
				printf("收到数据:");
			//将收到的数据发送到串口
			HAL_UART_Transmit(&huart1,UART1_RX_Buffer,USART_RX_STA & 0x3FFF,0xffff);
			//等待发送完成
			while(huart1.gState != HAL_UART_STATE_READY);
			
			printf("\r\n");
			//重新开始下一次接收
			USART_RX_STA = 0;
		}
		printf("hello world\n");
		HAL_Delay(1000);
  }
  /* USER CODE END 3 */
}

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

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

相关文章

.NET MAUI 安卓 UI 资源设置

本文主要介绍使用 MAUI 开发安卓应用时,如何更换和处理 UI 资源:应用名称,图标,主题配色,状态栏,闪屏。 文章目录1. 背景2. 资源设置2.1 项目创建2.2 应用名称2.3 应用图标2.4 应用闪屏2.5 沉浸式状态栏1. …

通用智能如何拥有生命的简单设计

如第一个图所示 是和环境交互的时候 行为交互时间和环境反馈时间T0 T1 还有行为消耗能量E0 环境反馈能量E1 如图有四种情况 其中反馈时间T1小于交互时间T0的任务是积极反馈 和打游戏一样要及时反馈才能提起兴趣 这个是整个行为交互过程中最小的记录单元 图二的每个元素都代表多…

STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

记录项目的详细制作过程,所以笔记很长,图很多、很多图不好CSDN搬运, 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接:https://pan.baidu.com/s/1Mk2EVIha7Fpj4Xductg3Uw?pwdVCC1 提取码:VCC1 笔记CSDN下载:…

C++11 入门

作者:小萌新 专栏:C进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍C11的一些背景知识 本篇博客主要是讲解一些关键字 C11前言C11诞生简介列表初始化{}初始化关键字autodecltypenullptr范围forSTL的更…

技术开发117

技术开发117 业务内容: 半导体制造设备零件(阀门零件、管件)、汽车的各种功能部件(发动机、动力转向器、空调、刹车和传动系统)、 建筑和工业设备部件、电信设备的零件、气动特殊气缸、供热和制冷系统的零件、其他一…

CAD中怎么绘制攒尖屋顶?CAD设计攒尖屋顶技巧

在给排水CAD设计中,有些时候为了需要会在图纸中绘制攒尖屋顶,那么你知道CAD软件中怎么构造攒尖屋顶三维模型吗?其实很简单,浩辰CAD给排水软件中提供了实用的攒尖屋顶功能,下面就和小编一起来看看浩辰CAD给排水软件中CA…

Android RCLayout 圆角布局,支持边框,渐变色,渐变色方向等

RCLayout 圆角布局,支持边框,渐变色,渐变色方向等 支持布局 RcRelativeLayout RcLinearLayout RcFrameLayout RcConstraintLayout RcAbsoluteLayout RcTextView 引入 implementation com.github.IHoveYou:RCLayout:1.0.1 项目地址 链接: github 布局属性 <!-- 背景色/渐…

Java-基础-1.异常

一&#xff1a;异常架构 Error 类层次描述了 Java 运行时系统内部错误和资源耗尽错 误。这类错误是我们无法控制的&#xff0c;同时也是非常罕见的错误。所以在编程中&#xff0c;不去处理这类错误。Error 表明系统 JVM 已经处于不可恢复的崩溃状态中。我们不需要管他。 如:写代…

电商前台项目(五):完成加入购物车功能和购物车页面

Vue2项目前台开发&#xff1a;第五章一、加入购物车1.路由跳转前先发请求把商品数据给服务器&#xff08;1&#xff09;观察接口文档&#xff08;2&#xff09;写接口&#xff08;3&#xff09;dispatch调用接口传数据&#xff08;4&#xff09;判断服务器是否已经收到商品数据…

Spring-相关概念入门

Spring-相关概念&入门 2&#xff0c;Spring相关概念 2.1 初识Spring 在这一节&#xff0c;主要通过以下两个点来了解下Spring: 2.1.1 Spring家族 官网&#xff1a;https://spring.io&#xff0c;从官网我们可以大概了解到&#xff1a; Spring能做什么:用以开发web、微服…

六、附近商户,连续签到,UV统计

文章目录附近商户GEO的基本用法导入店铺数据到GEO实现附近商户功能签到BitMap的基本用法实现签到功能实现连续签到统计功能补充&#xff1a;Java中>>和>>>的区别UV统计HyperLogLog的基本用法测试百万数据的统计官方命令文档&#xff1a;https://redis.io/comman…

OpenGLES(一)——介绍

一、OpenGL介绍 OpenGL&#xff08;全写Open Graphics Library&#xff09;是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像&#xff08;二维的亦可&#xff09;&#xff0c;是一个功能强大&#xff0c;调用方便的底层图形库。     O…

六、创建Gitee仓库和提交代码

1、创建仓库 1.1、创建远程仓库 (1)登录Gitee.com&#xff0c;点击右上角 号&#xff0c;再点击新建仓库。 (2)填写仓库名称&#xff0c;设置公开(一般指开源项目)或者私有&#xff0c;其他默认(也可以根据自己需要选择) (3)这里要勾选设置模板&#xff0c;Readme文件。(如果…

Java I/O 流详解(Basic I/O)

目录 1、Java Basic I/O 中的字节流&#xff1a;Byte Streams 2、Java Basic I/O 中的字符流&#xff1a;Character Streams 3、Java Basic I/O 中的缓冲流&#xff1a;Buffered Streams 4、Java Basic I/O 中的打印流&#xff1a;PrintStream &#xff08;数据扫描和格式化…

网易二面:CPU狂飙900%,该怎么处理?

说在前面 社群一位小伙伴面试了 网易&#xff0c;遇到了一个 性能类的面试题&#xff1a; CPU飙升900%&#xff0c;该怎么处理&#xff1f; 可惜的是&#xff0c;以上的问题&#xff0c;这个小伙没有回答理想。 最终&#xff0c;导致他网易之路&#xff0c;终止在二面&…

【蓝桥杯】Python字符串处理和应用

前言&#xff1a; 本文侧重于通过实战训练来提高字符串的处理能力&#xff0c;可以先行学习一下我之前的文章&#xff1a;蓝桥杯Python快速入门&#xff08;4&#xff09; &#xff0c;学习完基础知识再来刷题才会事半功倍&#xff01; 字符串处理 # 字符串切片 str1"1…

优秀码农选择对象详细指南,看完记得要实战噢

2023年了&#xff0c;你是否已到了法定年纪&#xff0c;那么这一篇优秀码农选择对象的详细指南&#xff0c;你一定用得到&#xff0c;看完记得感谢狗哥哦&#xff01; 目录 一、对于婚姻先来思考这么几条 1. 太快决定结婚&#xff1f; 2. 一方或双方急于结婚&#xff1f; 3.…

【go语言入门教程】——1. go语言介绍及安装

目 录1. go 语言简介2. go 语言安装2.1 下载安装包2.2 安装 go2.3 验证安装结果3. 使用 VS Code 运行 go 程序1. go 语言简介 go的产生 go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 go 是从 2007 年末由 Robert Griesemer, Rob Pike, Ken…

Linux系统常见问题总结(持续更新)

目录一&#xff0c;vim安装与设置1&#xff0c;安装2&#xff0c;配置二&#xff0c;Found a swap file by the name三&#xff0c;docker启动失败&#xff1a;Job for docker.service failed because the control process exited with error四&#xff0c;docker-compose安装r…

JavaScript基础知识点整理(一)——运算符比较、闭包、深浅拷贝、原型、

内容主要涉及JavaScript&#xff1a;运算符比较、闭包、深浅拷贝、原型。 JavaScript闭包、原型、深浅拷贝1、 和 的差异2、JavaScript闭包3、JavaScript深浅拷贝3.1、浅拷贝3.2、深拷贝4、JavaScript原型1、 和 的差异 对于而言&#xff0c;若对比双方的类型不一样的话&…