5,串口编程---实现简单的用串口发送接收数据

news2024/11/27 22:34:03

单片机通过串口向PC机发送数据

PC机通过串口接收单片机发过来的数据

1.UART和USART的区别:

USART支持同步通信方式,可以通过外部时钟信号进行同步传输,而UART仅支持异步通信方式

本开发板STM32F103ZET6有5个串口,用串口1作调试串口,因为串口通信和一键下载电路连接到了串口1上面,所i用串口1做调试串口

PA9因为传输输出的数据有高有低,串口1是外设,复用推挽输出,

PA10输入模式,只要不是模拟输入就行

1.IO初始化:PA9
usart外设初始化,另外需要写串口外设启动函数:USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
中断初始化,

2,写串口发送和接收函数

3,主函数调用

1,IO初始化:PA9

usart外设初始化,另外需要写串口外设启动函数:USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
中断初始化,
//PA9复用推挽输出  PA10浮空输入
void Usart_Init(void)
{
	//GPIO 开时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//库函数编程 IO初始化
	GPIO_InitTypeDef GPIO_InitStructure={0}; //定义结构体
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10; 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	//2外设初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	
	USART_InitTypeDef USART_InitStructure={0}; 
	USART_InitStructure.USART_BaudRate = 9600; //波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位长度
	USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位长度
	USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶失能
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制失能
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 
	USART_Init(USART1, &USART_InitStructure); 
	
	USART_Cmd(USART1, ENABLE); //使能USART1 外设
	
	//中断初始化
	NVIC_InitTypeDef NVIC_InitStructure={0}; 
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断通道:stm32f10x.h中
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 
	NVIC_Init(&NVIC_InitStructure); 
	//开启串口1接收中断
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 
}

因为还没有写中断源,不能判断是哪个中断,所以先不写中断服务函数USART1_IRQHandler

2,写串口发送和接收函数

串口的作用是通信,收发信息,所以先写串口的收发操作:发送函数和接收函数

发送函数:1,等待发送寄存器为空,也就是等待上一次数据发送完毕,所以需要一个能够获取串口的寄存器状态的函数,查看串口相关的库函数找到USART_GetFlagStatus (检查指定的 USART 标志位设置与否),等待发送寄存器为空:由下图知,当TXE等于1,即==SET,数据已经被转移到移位寄存器,表示数据已经发送完毕,

然后发送数据,查看串口相关的库函数找到串口发送函数USART_SendData(通过外设 USARTx 发送单个数据)

 接收函数分析同上,只不过接收函数需要另外定义变量接收函数返回值

void Usart_Send(uint8_t data)
{
	//等待发送数据寄存器为空(等待上一次数据发送完毕)
	//当不为1时,也就是数据没有发送完毕,进入循环,不执行发数据
	//等于1发送寄存器为空,上一次数据发送完毕,可以发送数据了,所以不进入循环,直接执行发送数据函数
	while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)!=SET){} //参考手册--中文P540
	//通过外设 USARTx 发送单个数据,库函数
		USART_SendData (USART1,data);
}

uint8_t Usart_Rece(void)
{
	//等待接收数据寄存器为空(等待上一次数据发送完毕)
		while( USART_GetFlagStatus(USART1, USART_FLAG_RXNE)!=SET){} //参考手册--中文P540
		//接收数据
		uint8_t data = USART_ReceiveData(USART1);
		return data;
}

 使用该函数可以实现打印串口发送的函数,(为什么代码这样写?官方规定的就是这样)

#include "stdio.h"
//fputc发送一个,串口打印数据
int fputc(int a,FILE *p)
{
	//串口发送函数
	Usart_Send(a);
	return a;
}

3.主函数这样写:

 运行可看到现象:

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

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

相关文章

git教程(IDEA + 命令行)

首先假设你已经安装 git 且 已经初始化完成: // 初始化git config --global user.name "你的用户名" git config --global user.email "你的邮箱"在当前文件夹下创建一个仓库,且该文件夹下会有多个项目 首先在当前文件夹下新建git…

网工内推 | 高校、外企网工,IE认证优先,年薪最高18w

01 上海外国语大学贤达经济人文学院 🔷招聘岗位:高校网络主管 🔷职责描述: 1、负责总机房、网络规划及管理,包括容量规划、成本评估、建设管理等; 2、负责设计、实施及维护全网络架构及规划网络变更计划 3、负责网络功…

什么是“SQL注入攻击”?如何预防和应对?

一、SQL注入攻击的概念 SQL注入攻击是一种针对数据库驱动的应用程序的攻击技术,其中攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,试图非法访问、操作或破坏后端数据库。当应用程序不正确地处理用户输入,并将其直接拼接到SQ…

C++学习/复习7--泛型编程/函数模板/类模板

一、泛型编程 1.Swap()函数的模板实现 二、函数模板 1.概念 2.格式 3.实例化 (1)隐式与显示 注意事项:隐式与显示类型转换会产生临时变量,临时变量有常性,所以形参前加const 三、类模板 1.定义 2.例1 3.例2 4.注意事…

错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。

全网唯一解决此BUG的文章!!! 你是否碰到了以下几种问题?先说原因解决思路具体操作1、首先将你C:\Windows\Microsoft.NET\文件夹的所有者修改为你当前用户,我的是administrator。2、修改当前用户权限。3、重启电脑4、删…

力扣225. 用队列实现栈

Problem: 225. 用队列实现栈 文章目录 题目描述:思路Code 题目描述: 思路 1.对一个queue模拟栈的操作,同时用一个int类型的变量topElem记录每次每次队列队尾的元素(也即是模拟stack中的stack的栈顶元素); 2…

Java Web集成开发环境Eclipse的安装及web项目创建

第一步:下载安装JDK http://t.csdnimg.cn/RzTBXhttp://t.csdnimg.cn/RzTBX 第二步:下载安装Tomcat Tomcat下载安装以及配置_tomcat下载配置-CSDN博客文章浏览阅读2.5k次,点赞2次,收藏13次。Tomcat下载安装及其配置_tomcat下载配…

调整图片和表格尺寸的命令:resizebox

\resizebox 是 LaTeX 中的一个命令&#xff0c;用于调整插入的内容&#xff08;如图像、表格、文本等&#xff09;的大小。它的语法如下&#xff1a; \resizebox{<width>}{<height>}{<content>}其中&#xff1a; <width> 和 <height> 分别表示…

【MATLAB】数字滤波器的设计

一、引言 在信号处理过程中&#xff0c;所处理的信号往往混有噪声&#xff0c;从接收到的信号中消除或减弱噪声是信号传输和处理中十分重要的问题。根据有用信号和噪声的不同特性&#xff0c;提取有用信号的过程称为滤波,实现滤波功能的系统称为滤波器。在以往的模拟电路中用的…

【算法】位运算算法——丢失的数字

题解&#xff1a;丢失的数字(位运算算法) 目录 1.题目2.题解3.位运算异或4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 哈希数组查漏高斯求和排序位运算异或… 3.位运算异或 class Solution { public:int missingNumber(vector<int>& nums) {int ret 0;for…

[Android]项目打包APK时报错PKCS12 keystore not in version 3 format

报错&#xff1a; PKCS12 keystore not in version 3 format Execution failed for task :app:packageRelease. > A failure occurred while executing com.android.build.gradle.tasks.PackageAndroidArtifact$IncrementalSplitterRunnable > com.android.ide.commo…

Java客户端SpringDataRedis(RedisTemplate)上手

文章目录 ⛄概述⛄快速入门❄️❄️导入依赖❄️❄️配置文件❄️❄️测试代码 ⛄数据化序列器⛄StringRedisTemplate⛄RedisTemplate的两种序列化实践方案总结 ⛄概述 SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模…

AI图书推荐:终极ChatGPT企业手册—借助Python和Java实现

《终极ChatGPT企业手册—借助Python和Java实现》&#xff08;Ultimate ChatGPT Handbook for Enterprises&#xff09;是一本关于ChatGPT的手册&#xff0c;旨在帮助企业利用AI能力、提示工程和ChatGPT的解决方案循环来改变企业景观。这本书提供了深入探讨ChatGPT的演变、能力以…

Linux 实验报告3-4

&#xff08;大家好&#xff0c;今天我们来学习Linux的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 实验三 vi编辑器 一、实验目的 二、实验内容 三、主要实验步骤 实验报告 1.进入 vi。 2.建立一个文件&…

磁盘管理后续——盘符漂移问题解决

之前格式化磁盘安装了文件系统&#xff0c;且对磁盘做了相应的挂载&#xff0c;但是服务器重启后挂载信息可能有问题&#xff0c;或者出现盘符漂移、盘符变化、盘符错乱等故障&#xff0c;具体是dev/sda, sdb, sdc 等等在某些情况下会混乱掉 比如sda变成了sdb或者sdc变成了sdb等…

贪心算法[1]

首先用最最最经典的部分背包问题来引入贪心的思想。 由题意可知我们需要挑选出价值最大的物品放入背包&#xff0c;价值即单位价值。 我们需要计算出每一堆金币中单位价值。金币的属性涉及两个特征&#xff0c;重量和价值。 所以我们使用结构体。 上代码。 #include <i…

信息学奥赛初赛天天练-14-阅读程序-字符数组、唯一分解定理应用

更多资源请关注纽扣编程微信公众号 1 2019 CSP-J 阅读程序1 (程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填√,错误填&#xff1b;除特殊说明外&#xff0c;判断题1.5分&#xff0c;选择题3分&#xff0c;共计40分) 1 输入的字符串只能由小写字母或大写字母组…

Matlab读取Swarm球谐系数,并绘制EWH全球格网图(存在疑问)

ICGEM官网下载 COST-G发布的4040的球谐系数 close all; clearvars -except; % addpath(E:\Code\Tool\Function\GRACE_functions); dir_degree_1 E:\Code\GRACE_data\Degree_1\deg1_coef.txt; dir_c20 E:\Code\GRACE_data\Degree_2\C20_RL06.txt; myDir_Swarm E:…

DuGa-DIT论文翻译

Dual Gated Graph Attention Networks with Dynamic Iterative Training for Cross-Lingual Entity Alignment 双门控图注意力网络与跨语言实体对齐的动态迭代训练 Abstract 近年来&#xff0c;跨语言实体对齐引起了相当大的关注。过去使用传统方法来匹配实体的研究都有一个…

调整表格大小

方法一&#xff1a;使用鼠标拖动表格边框或右下角的调整控点 在Word文档中&#xff0c;选中要缩小的表格&#xff0c;将鼠标指针放在表格的边框线上&#xff0c;直到指针变成双箭头的形状。 按住鼠标左键&#xff0c;拖动边框线&#xff0c;调整表格的宽度或高度。如果同时按住…