STM学习记录(六)————串口的发送接收

文章目录

  • 前言
  • 一、串口结构体及库函数
  • 二、实现串口发送(库函数)
    • 1.程序设计
    • 2.代码
  • 三.串口接收
    • 1.串口接收(普通)
    • 2.串口中断接收
    • 3. 串口发送字符串函数
    • 4.串口实现printf(重定向)
    • 5. 串口实现scanf(重定向)


前言

一个学习单片机的小白~ 有错误评论区或私信指出~

一、串口结构体及库函数

串口USART结构体:
 typedef struct
 {
 uint32_t USART_BaudRate;           
uint16_t USART_WordLength;         
uint16_t USART_StopBits;             
uint16_t USART_Parity;            
uint16_t USART_Mode;                
uint16_t USART_HardwareFlowControl; 
} USART_InitTypeDef;
串口USART相关库函数:
void USART_DeInit(USART_TypeDef* USARTx);
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* 
USART_InitStruct);
 void USART_StructInit(USART_InitTypeDef* USART_InitStruct);
 void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* 
USART_ClockInitStruct);
 void USART_ClockStructInit(USART_ClockInitTypeDef* 
USART_ClockInitStruct);
 void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
 void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, 
FunctionalState NewState);
 void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, 
FunctionalState NewState);
 void USART_SetAddress(USART_TypeDef* USARTx, uint8_t USART_Address);
 void USART_WakeUpConfig(USART_TypeDef* USARTx, uint16_t USART_WakeUp);
 void USART_ReceiverWakeUpCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_LINBreakDetectLengthConfig(USART_TypeDef* USARTx, uint16_t 
USART_LINBreakDetectLength);
 void USART_LINCmd(USART_TypeDef* USARTx, FunctionalState NewState);
 void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
 uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
 void USART_SendBreak(USART_TypeDef* USARTx);
 void USART_SetGuardTime(USART_TypeDef* USARTx, uint8_t 
USART_GuardTime);
 void USART_SetPrescaler(USART_TypeDef* USARTx, uint8_t 
USART_Prescaler);
 void USART_SmartCardCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_SmartCardNACKCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_HalfDuplexCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_OverSampling8Cmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_OneBitMethodCmd(USART_TypeDef* USARTx, FunctionalState 
NewState);
 void USART_IrDAConfig(USART_TypeDef* USARTx, uint16_t USART_IrDAMode);
 void USART_IrDACmd(USART_TypeDef* USARTx, FunctionalState NewState);
 FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t 
USART_FLAG);
 void USART_ClearFlag(USART_TypeDef* USARTx, uint16_t USART_FLAG);
 ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);
 void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t 
USART_IT);

二、实现串口发送(库函数)

1.程序设计

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设时钟
    • 初始化串口引脚
  • 串口发送

2.代码

//初始化系统
void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
	
}
	#include "stm32f10x.h"
	#include "main.h"
	#include "usart.h"
	
	int  main()
	{
		Usart_Init();
		
	   while(1)
		 {
			USART_SendData(USART1,'O');
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET );
			USART_SendData(USART1,'K');
			while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET );
		 }
	}

三.串口接收

1.串口接收(普通)

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设、LED时钟
    • 初始化串口和LED引脚
  • 串口发送控制LED灯
//串口初始化
#include "usart.h"
#include "stm32f10x.h"                  // Device header
#include <stdio.h>


void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
}
#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "LED.h"
#include <stdio.h>

int  main()
{
	LED_Init();
	Usart_Init();
	char temp;
	
   while(1)
	 {
			if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)//判断是否接受到数据
			{
					temp = USART_ReceiveData(USART1);//读收到的数据
					if(temp == 'A')
					{
						USART_SendData(USART1,temp);
						GPIO_ResetBits(GPIOA,GPIO_Pin_1);
					}
					if(temp == 'B')
					{
						USART_SendData(USART1,temp);
						GPIO_SetBits(GPIOA,GPIO_Pin_1);
					}
			}
			USART_ClearFlag(USART1,USART_FLAG_RXNE);//清除标志位
	 }  
}

2.串口中断接收

软件流程设计

  • 初始化系统
    • 初始化GPIO、串口外设、串口中断、NVIC、LED时钟
    • 初始化串口和LED引脚
    • 写串口中断控制语句
  • 串口发送控制LED灯
#include "usart.h"
#include "stm32f10x.h"                  // Device header
#include <stdio.h>


void Usart_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//TX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	//RX
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//配置串口中断
	USART_Cmd(USART1,ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
}
#include "stm32f10x.h"
#include "main.h"
#include "usart.h"
#include "LED.h"
#include <stdio.h>

int  main()
{
	LED_Init();
	Usart_Init();
	
   while(1)
	 {

	 }
		 
   
}
//串口中断函数
void USART1_IRQHandler(void)
{
	char temp;
	
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET )//判断串口中断接收是否产生
	{
		temp = USART_ReceiveData(USART1);//读数据
		if(temp == 'A')
		{
			putchar(temp);
			GPIO_ResetBits(GPIOA,GPIO_Pin_1);
		}
		if(temp == 'B')
		{
			putchar(temp);
			GPIO_SetBits(GPIOA,GPIO_Pin_1);
		}
		
	}
	USART_ClearITPendingBit(USART1,USART_IT_RXNE);

}

3. 串口发送字符串函数

思路:C语言字符串类似于字符数组最后一位是’\0’,可以用循环遍历,每遍历一遍发送一个数据,遍历到’\0’时结束循环,本质上还是传输一个字符数据不过是一次发一连串字符。

代码实现:

void USART_SendString(USART_TypeDef* USARTx, char * String)
{
	uint16_t i = 0;
	do
	{
		USART_SendData(USARTx,*(String + i));
		while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );
		i++;
	}while(*(String + i) != '\0');
	while( USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET );	
}

4.串口实现printf(重定向)

修改printf底层代码,重载函数fputc

代码实现:

int fputc(int ch,FILE *f)
{
	
	USART_SendData(USART1,(uint8_t)ch);
	while( USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET );	
	
	
	return (ch);
}

5. 串口实现scanf(重定向)

修改scanf底层代码,重载函数fgetc

代码实现:

int fgetc(FILE *f)
{
	
	while( USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET );	
	
	
	return (int)USART_ReceiveData(USART1);
}

注:使用priintf、scanf记得勾选UseMicroLIB
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

五大维度大比拼:ChatGPT比较文心一言,你的AI助手选择指南

文章目录 一、评估AI助手的五个关键维度二、ChatGPT和文心一言的比较 评估AI助手的五个关键维度&#xff0c;以及ChatGPT和文心一言的比较如下&#xff1a; 一、评估AI助手的五个关键维度 界面友好性 &#xff1a; 评估标准&#xff1a;用户界面是否直观易用&#xff0c;是否…

详解 HBase 的架构和基本原理

一、基本架构 StoreFile&#xff1a;保存实际数据的物理文件&#xff0c;StoreFile 以 HFile 的格式 (KV) 存储在 HDFS 上。每个 Store 会有一个或多个 StoreFile&#xff08;HFile&#xff09;&#xff0c;数据在每个 StoreFile 中都是有序的MemStore&#xff1a;写缓存&#…

Samba 服务器的搭建以及windows server 2008客户端的使用实验报告

一、 实验目的 通过 Samba 服务器的搭建&#xff0c;基本了解搭建服务器的基本步骤&#xff0c;理解 Samba 服务器的实现文件共享的功能&#xff0c;如何配置 Samba服务器配置文件等。 二、 实验环境 准备一台安装 centOS7系统的 Linux 虚拟机作为 Samba 服务器 server,准备…

手机ip地址怎么换成成都的

随着互联网的快速发展&#xff0c;我们越来越依赖于网络进行各种操作。而在某些情况下&#xff0c;为了更好地享受网络服务或保护个人隐私&#xff0c;我们可能需要改变手机的IP地址。本文将详细介绍如何将手机IP地址换成成都的&#xff0c;同时提醒大家在操作过程中需要注意的…

如何学习创建和使用 Java 归档(JAR)文件

1. 简介 JAR&#xff08;Java ARchive&#xff09;文件是一种用于打包多个Java类、资源文件和元数据的压缩文件格式。它在Java开发和发布过程中扮演着重要角色。通过使用JAR文件&#xff0c;开发者可以将应用程序的所有组件打包在一个文件中&#xff0c;方便分发和部署。 2. …

二次元资源汇总

获取更多资源&#xff0c;请关注公众号&#xff1a;阿宇的编程之旅&#xff0c;回复‘书签’获取 动漫网站 动漫世界 网站名称&#xff1a;动漫世界网址&#xff1a;nav.acgsq.com介绍&#xff1a;中国最大最权威的正版动漫网站&#xff0c;提供漫画、动画、资讯、论坛等全方…

一些激活函数

一些激活函数 摘要激活函数分类sigmoidTanhSoftsignSoftmaxReLUSoftplusNoisy ReLULeaky ReLUPReluELUSELUSwishGELUGLUGEGLUMishMaxout 摘要 本篇博客对一些激活函数进行总结&#xff0c;以便加深理解和记忆 激活函数分类 饱和激活函数&#xff1a;sigmoid、tanh… 非饱和激…

短链接生成器排名前三!长链接转化成短链接工具有哪些?

在现今的网络营销环境中&#xff0c;短链接的应用越来越广泛。它不仅能简化长链接&#xff0c;提高分享效果&#xff0c;还能提升企业品牌形象和用户体验。于是&#xff0c;市场上涌现出众多短链接生成工具。本文将为您揭秘短链接生成器排名前三的产品&#xff0c;帮您找到最适…

ABB工业喷涂机器人保养,轻松搞定!

小伙伴都知道机器人在长时间的使用下&#xff0c;难免遇到一些机械手故障。一旦发生了机器人故障&#xff0c;会影响整个生产线的作业&#xff0c;那么怎么才能做到防止机器人的故障率发生呢&#xff1f;定期的保养与维护显得尤为重要&#xff0c;一个好的维修保养服务商也很重…

yml配置文件快速上手

yml配置文件快速上手 springboot中&#xff0c;有三种文件可以作为配置文件 xml文件(不推荐&#xff0c;臃肿)application.propertis文件&#xff08;层次不够分明&#xff09;yml文件&#xff08;推荐&#xff0c;层次分明&#xff0c;语法简洁&#xff09; yml文件的基本语…

【递归、搜索与回溯】记忆化搜索

一、经验总结 以斐波那契数为例引入今天的主角&#xff1a;记忆化搜索和动态规划 题目链接 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 算法原理 编写代码 //解法二&#xff1a;递归->记忆化搜索 class Solution {int mem[31]; //备忘录 public…

揭秘未来:用线性回归模型预测一切的秘密武器!

线性回归模型 1. 引言2. 理论基础2.1 线性回归模型的定义与原理原理与关键假设模型参数估计 2.2 模型评估指标2.2.1 残差分析2.2.2 拟合优度指标2.2.3 统计检验 3. 应用场景3.1. 金融领域中的应用3.2. 医疗健康领域中的应用3.3. 其他领域的应用 4. 实例分析4.1、数据集选择4.2、…

目标检测算法YOLOv10简介

YOLOv10由Ao Wang等人于2024年提出&#xff0c;论文名为&#xff1a;《YOLOv10: Real-Time End-to-End Object Detection》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/2405.14458 &#xff1b;源码见: https://github.com/THU-MIG/yolov10 以下内容主要来自论文&a…

Open To Buy(OTB)计划:零售业者的库存管理利器

在当今快速变化的服装市场中&#xff0c;如何高效、精准地进行商品管理成为了服装企业竞争的关键。OTB&#xff08;Open-to-Buy&#xff09;作为一种有效的商品管理方法&#xff0c;在企业管理中扮演着至关重要的角色。它基于预算、商品计划以及市场需求等多维度因素&#xff0…

《优化接口设计的思路》系列:第1篇—什么是接口缓存

一、缓存的定义&#xff1a; 缓存是一种存储数据的技术&#xff0c;用于提高数据访问的速度和效率。缓存通常存储在内存中&#xff0c;因为内存访问速度远快于磁盘和网络。数据接口通常会使用缓存技术&#xff0c;以降低对后端数据存储和处理的压力&#xff0c;提高系统性能。…

CSAPP -lecture01

##01COURSE OVERVIEW int or not intergers ,float and not reals that you need to understand what the system dose ,what make it run wll,what make it run poorly .in order to be able to do that kind of optimization

期货到底难在哪里?

第一难&#xff1a;使用杠杠&#xff0c;杠杠放大的其实是你性格、天赋和技能上的弱点&#xff0c;同时相应缩小你这三个方面的优点&#xff1b;第二难&#xff1a;双向交易。如果只能做多&#xff0c;理论上你每次交易将有50%的概率盈利。现在既能做多又能做空&#xff0c;只剩…

Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope

本文主要介绍如何在无需网关&#xff0c;无需配置 HttpClient 的情况下&#xff0c;使用 Semantic Kernel 直接调用本地大模型与阿里云灵积 DashScope 等 OpenAI 接口兼容的大模型服务。 1. 背景 一直以来&#xff0c;我们都在探索如何更好地利用大型语言模型&#xff08;LLM&…

如何快速搭建产业数字化生态链?

如何快速搭建产业数字化生态链&#xff1f;这是当下许多企业都在思索的关键问题。 首先&#xff0c;要明确自身的核之心优势与定位&#xff0c;找到在数字化生态中的独特价值。 加强与产业链上下游企业的合作与协同&#xff0c;打破信息壁垒&#xff0c;实现资源共享与互补。 注…

重生奇迹mu圣导师介绍

出生地&#xff1a;勇者大陆 性 别&#xff1a;男 擅 长&#xff1a;统率&宠物使用 转 职&#xff1a;祭师&#xff08;3转&#xff09; 介 绍&#xff1a;当玩家账号中有一个Lv250以上角色时&#xff0c;便可以创建职业为圣导师的新角色&#xff0c;圣导师每升一级获得…