嵌入式开发与应用实验四——通过串口通信实现收发功能

news2024/12/26 0:21:46

一、实验目的

1. 了解 USART 的基本特性;

2. 掌握STM32串口通信的基本原理,了解异步通信的概念;

3. 掌握用库函数操作 USART 的方法,学习编程实现STM32的USART通信;

4. 掌握如何使用 STM32 的串口发送和接收数据。

二、实验内容

1. 用STM32设计一个与计算机进行串口通信的实验,实现查询方式串口的收发功能,接收来自串口的字符并将接收到的字符发送到超级终端,用串口调试助手显示出来,查询方式完成。使用STM32单片机完成基本的IO口控制,了解嵌入式系统中的中断处理方法、定时器、串口通讯等内容。

2. STM32串口与电脑USB口通信示意图

三、实验器材(设备、元器件)

(一)装有Keil uVision5软件的计算机一台

(二)STM32f103VET6的开发板一块

四、实验步骤

1. 串行接口 (Serial Interface)简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

(1)数据通信按数据传输方向分类:单工通信、半双工通信、全双工通信

单工通信:数据只能沿一个方向传输;

半双工通信:数据可以沿两个方向传输,但需要分时进行;

全双工通信:数据可以同时进行双向传输;

(2)按照通信方式,分为:同步通信,异步通信

同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口;

异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线。通信双方约定相同波特率来保证数据传输和接收的有效性;常见的异步串行通信方式有Uart、Usart。

(3)数据通信按数据通信方式分类:串行通信、并行通信

(4)常见的串行通信接口

2. 该程序的主要任务为将USART的数据进行接收,并在数码管上显示。具体包括以下子函数:①USART1_Config:USART1的配置子函数;

②GPIO_Conifig:对PB,PA以及RX引脚进行配置的子函数;

③ main( ):完成数据的接收和显示的主函数。

(1) 函数USART1_Config():该函数对USART1 GPIO和工作模式进行配置,包括使能时钟。配置其波特率,数据长度,停止位长度,工作方式,有无校验位,硬件流的控制等。配置完成后初始化USART1并使能;
(2)使用GPIO_InitTypeDef和USART_InitTypeDef结构体定义一个GPIO初始化变量以及一个USART初始化变量。调用RCC_APB2PeriphClockCmd()函数开启GPIO端口时钟,使用GPIO之前必须开启对应端口的时钟和开启USART时钟;

(3) GPIO_Conifig:使用GPIO之前需要初始化它,并且还要特殊设置,因为用它作为外设的引脚,一般都有特殊功能。在初始化时需要把它的模式设置为复用功能。这里把串口的Tx引脚设置为复用推挽输出,Rx引脚为浮空输入,数据完全由外部输入决定,选定USART的GPIO为PA9。

串口初始化,由于将PA9和PA10复用为USART1,而PA9对应的是发送端,PA10对用的是接收端,因此需要配置PA9为复用推挽输出方式,PA10配置为浮空输入方式:


 (4) 配置USARTI通信参数为:波特率115200,无奇偶校验,1个停止位,数据长度为8,不使用硬件流控制,收发一体工作模式,然后调用USART初始化函数完成配置。

  串行通信中的波特率和比特率:波特率指数据信号对载波的调制速率,波特率的单位是波特(baud),比特率指单位时间内传输的比特数,单位bit/s(bps),而对于USART来说,波特率和比特率是相等的。总之,波特率越大传输速率越快,通过控制时钟可以改变波特率。

  • 波特率:等同比特率,表示每秒钟传送的二进制位数,单位是比特每秒(bit/s);
  •  常见波特率:9600 、19200、115200;
  • 如串口的波特率为9600,表示1秒中可传输9600个bit;
  • 其中,传输1个bit需要104us(计算1000ms/9600 = 104us)。

波特率计算公式:

A. 空闲状态:高电平,此时无数据传输;

B. 奇偶校验
    奇校验:如果数据位中“1”的数目是偶数,则校验位为高电平1,如果数据位中“1”的数目是奇数,则校验位为低电平0;
    偶校验:如果数据位中“1”的数目是奇数,则校验位为高电平1,如果数据位中“1”的数目是偶数,则校验位为低电平0;

C. 停止位配置:表示传输的结束,并且提供计算机校正时钟同步的机会;

    1个停止位:停止位位数的默认值;

  •     2个停止位:可用于常规USART模式、单线模式以及调制解调器模式;

    0.5个停止位:在智能卡模式下接收数据时使用;

    1.5个停止位:在智能卡模式下发送和接收数据时使用;

D. 编程可配置的数据长度:8位或者9位(包含校验位),如9位是指8bit数据+1bit奇偶校验;


  (5) 使用USART1接收中断,需要配置 NVIC,这里调用NVIC_Configuration()函数完成配置。配置完NVIC之后调用USART_ITConfig()函数使能USART1接收中断;
  (6) 最后调用USART_Cmd()函数使能USART,这个函数最终配置的是USART_CR1的DE位,具体的作用是开启USART1的工作时钟,没有时钟USART1就工作不了;


3. 嵌套向量中断控制器NVIC配置
  配置USART1作为中断源,因为本实验对优先级没有具体要求,中断优先级随意设置。在中断章节已对嵌套向量中断控制器的工作机制做了详细的讲解,这里可直接使用。

4. USART相关寄存器

5. USART中断服务函数

(1) 这段代码是存放在“stm32flxx_it.c”文件中的,该文件用来集中存放外设中断服务函数。当使能了中断并且中断发生时就会执行文件中的中断服务函数。

(2) 函数USART1_Config()使能了USART接收中断,当USART接收到数据就会执行函数USARTl_IRQHandler()。函数USART_GetITStatus()与函数USART_GetFlagStatus()类似用来获取标志位状态,但函数USART_GetITStatus()是专门用来获取中断事件标志的,并返回该标志位状态。使用语句来判断是否产生USART数据接收这个中断事件,如果是,就使用USART数据读取函数 USART_ReceiveData()的数据到指定存储区。主函数根据标志位再读取接收到的数据,并发送到PC端的串口调试助手。

(3) 串口数据接收和发送过程如下:

6. 主函数

7. 编译下载,观察串口通信是否能够正常进行

五. 实验数据及结果分析

1. 主函数如下:

#include "stm32f10x.h"   // Device header
#include "usart.h"  

volatile uint8_t USART1_RevDat=1;
int main()
{
  
	USART1_Condig();
	NVIC_Configuration();
	while(1)
	{
	
	}
}

2. USART函数如下:

#include "stm32f10x.h" 

void USART1_Condig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, ENABLE);  
	// 打开串口GPIO、外设的时钟
	
  	//把串口发送TX引脚设置为复用推挽
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //配置为推挽复用模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

	//把串口接收RX设置为浮空输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate=115200;                //设置波特率
	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_Rx|USART_Mode_Tx;//发送接受模式
	USART_Init(USART1,&USART_InitStructure);    //使能串口接受中断
		 
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能串口接受中断
	USART_Cmd(USART1,ENABLE);	                //使能串口
}

void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

3. USART中断服务函数

#include "stm32f10x_it.h"
#include "usart.h"

extern volatile uint8_t USART1_RevDat;
void USART1_IRQHandler()
{
    USART1_RevDat=USART1->DR;
	USART_SendData(USART1,USART1_RevDat);
	while(USART_GetFlagStatus(USART1,USART_IT_RXNE)==RESET);  /* 等待发送完毕 */
}

4. 代码编译结果如下:

5. 实验完成串口数据接收和发送过程如下:

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

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

相关文章

vue part 11

vuex的模块化与namespace 115_尚硅谷Vue技术_vuex模块化namespace_1_哔哩哔哩_bilibili 116_尚硅谷Vue技术_vuex模块化namespace_2_哔哩哔哩_bilibili vue-router路由 很常见的很重要的应用:Ajax请求,将响应的数据替换掉原先的代码从而实现不跳转页面…

监控系列之-Grafana面板展示及制作

一 Grafana设置添加数据源 1、设置Grafana中文显示 最后保存退出,数据源添加完毕 2、导入node_exporter主机监控面板 此处 有外网的情况下,直接输入对应面板的ID号,然后点击加载即可;无无外网的话,则考虑使用上传仪表…

钢材表面缺陷数据集以coco格式做好了数据集的划分,1200张训练集,600张验证集,对应的json文件也在里面

钢材表面缺陷数据集 以coco格式做好了数据集的划分,1200张训练集,600张验证集,对应的json文件也在里面。 钢材表面缺陷检测数据集营销介绍 项目背景: 钢材作为工业生产的重要原材料之一,其表面质量直接影响到成品的性…

基于菜鸟教程的flask学习记录 —— Flask视图函数

文章目录 前言Flask视图函数1.定义视图函数2.接收请求数据(1)获取URL参数(2)获取表单数据(3)获取查询参数 3.返回响应(1)返回字符串(2)返回HTML模板&#xff…

机器人自主导航从零开始第四步———Rviz、Gazebo、Meshlab的安装

本文参考资料: rviz - ROS 维基 Gazebo : Tutorial : Ubuntu (gazebosim.org) 零. 什么是Rviz和Gazebo: Rviz是一个三维可视化工具,它利用已有的数据将数据可视化,并提供了可以显示图像、模型、表格、路径等信息的插件&#x…

css百分比布局中height:100%不起作用

百分比布局时,我们有时候会遇到给高度 height 设置百分比后无效的情况,而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时,是相对于父元素的高度来计算的。当没有给父元素设置高度(height)时或设置…

浮点数始末详解|科学计数法、浮点数表示、精度有效值、规格化与非规格化

如果直接看浮点数表示法有点费力或者不好理解,不妨复习一下科学计数法。毕竟我们一直接触十进制,从十进制的角度可能更好理解其特性。 目录 科学计数法 Scientific Notation1. 科学计数法的定义2. 精确度与有效数字3. 转换为科学计数法示例:…

商务人士必备的精准翻译工具盘点

网易翻译是一款我外出游玩时候必备的翻译工具,最近没出去玩但是有更多的翻译需求了,为了方便在电脑上的操作我也找了不少翻译工具,这次一起分享给大家,看看哪款更得你的眼缘。 1.福昕在线翻译 链接直达:https://fany…

集群聊天服务器项目【C++】(六)MySql数据库

前面已经介绍了网络模块和业务模块,本章介绍数据模块,同样保持模块解耦的特性,即业务模块不能出现数据模块内容,如出现SQL语句,接下来看看怎么实现的。 1.环境安装 第一章已经介绍了MySql安装,但注意需要…

基于R语言的统计分析基础:使用SQL语句操作数据集

在使用R语言数据分析时,可以融合SQL语言使数据聚集操作更加便利,同时也可以增加对SQL语句的熟悉。借助sqldf、DBI、RSDLite等包,可以在R环境中直接运用SQL语句,轻松实现数据的分组统计、汇总分析,SQL的强大查询能力简化…

MTC完成右臂抓取放置任务\\放置姿态设置

#include "mtc_tutorial/mtc_glass_bottle.hpp" static const rclcpp::Logger LOGGER rclcpp::get_logger("mtc_glass_right"); // 获取节点基础接口的实现 rclcpp::node_interfaces::NodeBaseInterface::SharedPtr MTCTaskNode_Right::getNodeBaseInterf…

(c++)字符串相加(真没想到字符串还有相加运算)

#include<iostream> #include<string> using namespace std;int main() {string ch1 "你好";string ch2 "再见";string ch3 ch1 ch2;cout << ch3 << endl;system("pause");return 0; } 运行结果&#xff1a; 学了c…

FreeRTOS学习——链表list

FreeRTOS学习——链表&#xff08;列表&#xff09;list&#xff0c;仅用于记录自己阅读与学习源码 FreeRTOS Kernel V10.5.1 参考大佬的好文章&#xff1a; freertos内核原理 Day1(链表) FreeRTOS-链表的源码解析 *list_t只能存储指向list_item_t的指针。每个list_item_t都…

【UE5 C++课程系列笔记】01——Visual Studio环境安装

1. 进入Visual Studio 官网&#xff0c;点击下载 下载社区版即可 下载后点击应用程序开始安装 2. 在“工作负荷”中&#xff0c;勾选如下选项 在“单个组件”中&#xff0c;勾选如下选项&#xff1a; 3. 等待下载安装 4. 安装好后&#xff0c;点击“继续但无需代码” 选择“工具…

《python语言程序设计》2018版第8章17题point类设计一个名为point的类

TypeError: point_class.dis_m() missing 1 required positional argument: ‘y2’ 这段代码为什么出错 一个又一个错误 终于摸到点头绪 #distance方法 我做的叫get_dis_m def get_dis_m(self):a_m self.__x1 - self.__x2b_m self.__y1 - self.__y2return (pow(a_m, 2) po…

k8s中的存储

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

《程序猿之设计模式实战 · 观察者模式》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

AJAX 进阶 day4

目录 1.同步代码和异步代码 2.回调函数地狱和 Promise 链式调用 2.1 回调函数地狱 2.2 Promise - 链式调用 2.3 Promise 链式应用 3.async 和 await 使用 3.1 async函数和await 3.2 async函数和await_捕获错误 4.事件循环-EventLoop 4.1 事件循环 4.2 宏任务与微任务…

R语言统计分析——散点图1(常规图)

参考资料&#xff1a;R语言实战【第2版】 R语言中创建散点图的基础函数是plot(x,y)&#xff0c;其中&#xff0c;x和y是数值型向量&#xff0c;代表着图形中的&#xff08;x,y&#xff09;坐标点。 attach(mtcars) plot(wt,mpg,main"Basic Scatter plot of MPG vs. Weigh…

数据结构(Day14)

一、学习内容 结构体 概念 引入&#xff1a;定义整数赋值为10 int a10; 定义小数赋值为3.14 float b3.14; 定义5个整数并赋值 int arr[5] {1 , 2 , 3 , 4 ,5}; 定义一个学生并赋值学号姓名成绩 定义一个雪糕并赋值名称产地单价 问题&#xff1a;没有学生、雪糕 数据类型 解决&…