串口UART

news2024/9/25 9:31:13

常见通信接口

 串口定义

串口定义:

通用串行异步收发器

  • 通用:UART的应用非常广泛,应用领域:工控行业,电力系统等
  • 串行:处理器和外设之间只需连接一根信号线,处理器和外设数据传输是一个bit位一个bit位的传输

切记:UART数据传输从低位开始传输

通用串行异步收发器

收发器:发送数据和接收数据的硬件单元

  • 如果CPU给外设发送数据:CPU是发送器,外设是接收器
  • 如果外设给CPU发送数据:外设是发送器,CPU是接收器
     

UART数据传输的协议

串口特性

电器特性:串口标准规定了电平的高低阈值和电平范围

TTL电平:硬件平台使用的TTL电平

  • 高电平:3.3v或者5v
  • 低电平:0v

EIA电平:串口线上的电平标准

  • 高电平:-3~-15v
  • 低电平:3v~15v

举例:外设发送逻辑低电平

串口线上是0(3.3v),但CPU读取到3.3v认为是1,数据传输错误

需要进行电平转换:电脑(TTL->EIA)--- 串口线 --- CPU(EIA->TTL)

机械特性

连接器类型

  • 串口座
  • USB转串口
  • 接插件-三个插针(TX/RX/GND)

协议中的概念

  • 空闲位:处理器和外设不进行数据传输时,数据线上持续发送空闲位,空闲位的有效位数为一个bit位, 高电平有效
  • 起始位:如果处理器和外设开始传输数据,首先传输起始位,有效位数为一个bit位,低电平有效
  • 数据位:表示处理器和外设传输数据的有效位数,数据位的有效位数:5/6/7/8,一般选择8位(表示传输的数据有效位数为8个bit位)注意:处理器和外设数据位保持一致
  • 奇偶校验位:用于检测双方数据传输是否发送了错误,有效位数为一个bit位,如果不校验,则无需发送校验位,注意:双方的校验方式保持一致

  •  停止位:如果处理器和外设要结束数据的传输,只需发送停止位即可,有效位数为:1/2有效电平是高电平,注意:处理器和外设停止位保持一致

  • 波特率:表示双方数据传输的速率,常用的两个波特率:115200bps/9600bps(bps = bit per second = 每秒传输多少位),注意:双方的配置也要一致

 

UART的三种工作方式

  • 单工:数据传输永远朝一个方向
  • 半双工:数据传输可以双向进行,但是同一时刻只能朝一个方向
  • 全双工:数据传输可以同时双向进行,一般都是工作在全双工模式下

切记结论:UART实际硬件连接至少三根线:TX(发送),RX(接收),GND(共地)

 

硬件连接

简化硬件 

UART控制器

发送数据流程:

  • 由于CPU核发送数据的速度,也就是向数据寄存器DR中写入数据的速度远远快于发送移位寄存器将数据一位一位的发送到TX引脚上的速度,所以首先判断TC位是否为1,如果为1表示发送数据寄存器为空则CPU方可发送数据,否则采用轮询方式等待,直到发送数据寄存器为空也就是TC为1时才能发送下一个数据
  • 如果TC为1,则CPU核软件上以指针或者采用库函数将数据放到数据寄存器DR中
  • 发送数据寄存器的数据硬件上自动拷贝到发送移位器中
  • 发送移位器根据给定的波特率将数据一位一位的按照UART协议发送到TX引脚上

 接收数据流程:

  • 接收移位器首先根据给定的波特率将数据一位一位的按照UART协议从RX引脚上获取数据
  • 接收移位寄存器中的数据硬件上自动拷贝到数据寄存器DR中
  • 由于CPU核从数据寄存器DR中读取数据的速度远远快于接收移位器从RX引脚上一位一位接收数据的速度,所以当RXNE为1时,CPU核方可从数据寄存器DR中获取数据,否则CPU核轮询等待,直到数据寄存器DR中有数据也就是RXNE为1时CPU才能读取数据
  • 如果RXNE为1,则CPU核软件上以指针或者采用库函数从数据寄存器DR中读取数据

测试代码

uart.c

//USART.c
#include "uart.h"

void UART_Init(void){
	//打开GPIOA和USRTA的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
	
	//配置PA9为推挽复用输出,TX 
	GPIO_InitTypeDef GPIO_Config;
	GPIO_Config.GPIO_Pin = GPIO_Pin_9;
	GPIO_Config.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Config.GPIO_Mode = GPIO_Mode_AF_PP;

	GPIO_Init(GPIOA, &GPIO_Config);
	
	//配置PA10为浮空输入,RX
	GPIO_Config.GPIO_Pin = GPIO_Pin_10;
	GPIO_Config.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_Config);
	
	//配置串口工作参数
	USART_InitTypeDef USART_Config;
	USART_Config.USART_BaudRate = 115200;
	USART_Config.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_Config.USART_Mode =  USART_Mode_Rx | USART_Mode_Tx;
	USART_Config.USART_Parity = USART_Parity_No;
	USART_Config.USART_StopBits = USART_StopBits_1;
	USART_Config.USART_WordLength = USART_WordLength_8b;
	USART_Init(USART1,&USART_Config);
	
	//使能串口1
	USART_Cmd(USART1,ENABLE);
	
}
//发送一个字符
void UART_Putc(char c){
	//界定DR寄存器中是否有数据
	//返回值RESET继续等待,SET不要等待,可以向DR中放入数据
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
	//将字符串放到串口1的DR寄存器中
	USART_SendData(USART1, c);
}
void UART_Puts(char* pstr){
	//u8 pstr_len = sizeof(pstr)/sizeof(pstr[0]);
	//for(int i =0; i<pstr_len;i++)
	//	UART_Putc(pstr[i]);
	while(*pstr){
		UART_Putc(*pstr);
		pstr++;
	}
}


//读取一个字符
char UART_Getc(void){
	//判断接收数据寄存器DR是否还有有效数据
	while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) == RESET);
	//从串口1中读取数据
	return (char)USART_ReceiveData(USART1);
}

//读取一个字符串
void UART_Gets(char* buf,u32 len){
	int i = 0;
	for(i = 0;i<(len-1);i++){
		//每读取到一个字符就放到buf里
		buf[i] = UART_Getc();
		//如果读取到\n字符,就不继续读取了
		if(buf[i] == '\n'){
			break;
		}
	}
	buf[i-1] = '\0';
	
}

调用main.c

// @file : main.c

#include "stm32f10x.h"
#include "uart.h"
#include "systick.h"
#define BUF_LEN 128
static char buf[BUF_LEN];
int main(void){
	UART_Init();
	Systick_init();

	while(1){
		// 下位机->上位机:请输入消息 
		UART_Puts("please put string");
		// 上位机发送消息给下位机
		UART_Gets(buf,BUF_LEN);
		//回显
		UART_Puts("\n");
		UART_Puts("your input:");
		UART_Puts(buf);
		UART_Puts("\n");

	}

}

效果展示

串口调试工具

在调试工具中进行设置,端口,波特率,数据长度,停止位,和上位机设置匹配

选择端口

选择端口号,配置波特率,打开串口

在串口调试助手中向STM32发送welcome to beijing

显示效果

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

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

相关文章

CORS跨域问题全解:原理、问题与解决方案

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

【Qt】QDesigner 源码 控件图片资源路径

qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\win qttools-5.12.12-designer-1\qttools-5.12.12-designer\qttools-5.12.12\src\designer\src\components\formeditor\images\widgets

docker部署drawio

1&#xff09;介绍Drawio.io GitHub&#xff1a;GitHub - jgraph/drawio: draw.io is a JavaScript, client-side editor for general diagramming. Draw.io是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建…

【源码+文档+调试讲解】健美操评分系统

摘 要 健美操评分系统采用B/S架构&#xff0c;数据库是MySQL。系统的搭建与开发采用了先进的JAVA进行编写&#xff0c;使用了springboot框架。该系统从三个对象&#xff1a;由管理员、裁判员和用户来对系统进行设计构建。主要功能包括首页&#xff0c;个人中心&#xff0c;裁判…

2024潜力市场:工商业屋顶光伏项目开发!

随着全球对可再生能源的日益重视和“双碳”目标的持续推进&#xff0c;工商业屋顶光伏项目作为分布式光伏的主要类型之一&#xff0c;正迎来前所未有的发展机遇。 一、技术成熟度与成本降低 近年来&#xff0c;光伏技术的飞速发展显著提升了光伏组件的转换效率&#xff0c;并降…

记git仓库由局域网迁移到外网

项目管理平台&#xff1a;gitlab 一台云主机 流程&#xff1a; 1.外网机器上搭建gitlab 2.项目网站上新建空白项目 3.本机就项目切换到主分支&#xff0c;切换源&#xff1a;git remote set-url origin http://x.x.x.x:yyy/zzzz/new.git 4.登陆新平台的账号&#xff0c;使…

【吸引力法则】探究人生欲:追求深度体验与宇宙链接

文章目录 什么是人生欲&#xff1f;唤醒人生欲&#xff1a;克服配得感的三大障碍1 第一大障碍&#xff1a;法执的压制2 第二大障碍&#xff1a;家庭的继承2.1 家庭创伤的代际传递2.2 家庭文化基因的传递2.2.1 “成年人最大的美德是让自己的生活过得更加精彩。”2.2.2 荷欧波诺波…

【数据分享】1999—2022年地级市地区生产总值及一二三产构成数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…

第二十三节、血量更新逻辑的实现

一、创建代码 引入命名空间 using UnityEngine.UI; 调用UI必须有这个代码 二、ScriptObject类 1、是一个持久化存储文件的类型 接收所有的事件方法 先继承SO类&#xff0c;然后创建项目菜单 2、进行订阅 放入事件类&#xff0c;关联代码&#xff0c;即可进行广播 传递给这…

【什么是依赖倒置原则?】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

还原source insight4.0的工具栏

工具栏消失了一部分 要还原 Source Insight 工具栏&#xff0c;可以按照以下步骤操作&#xff1a; 打开 Source Insight。在菜单栏中选择 "View"&#xff08;视图&#xff09;。在下拉菜单中选择 "Toolbars"&#xff08;工具栏&#xff09;。在弹出的子菜…

聊聊对神经网络的基础理解

这是鼎叔的第一百零六篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。本人新书《无测试组织-测试团队的敏捷转型》已出版&#xff08;机械工业出版社…

GIS中AI矢量化工具

减少矢量化中86%工作量的AI工具 最近我在X平台有注意到一个矢量化工具&#xff0c;AI Vectorizer &#xff0c;根据实验对比&#xff0c;这个AI工具可以减少在矢量化过程中86%的鼠标点击数&#xff0c;极大地减少矢量化过程中的工作量。 AI Vectorizer 需要通过网络交互&#…

【HarmonyOS NEXT星河版开发学习】综合测试案例-各平台评论部分

目录 前言 功能展示 整体页面布局 最新和最热 写评论 点赞功能 界面构建 初始数据的准备 列表项部分的渲染 底部区域 index部分 知识点概述 List组件 List组件简介 ListItem组件详解 ListItemGroup组件介绍 ForEach循环渲染 列表分割线设置 列表排列方向设…

高德地图SDK Android版开发 6 显示覆盖物

高德地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互动画其它属性 折线的更多属性常用属性其它属性 多边形的更多属性常用属性其它属性 Arc的更多属性Ci…

5.2、配置stp

一、常用命令罗列 1. 查看STP状态 show spanning-tree功能&#xff1a;显示交换机上生成树协议的当前状态&#xff0c;包括各个端口的状态、根桥信息、VLAN相关信息等。 2. 启用STP spanning-tree vlan [VLAN_ID]功能&#xff1a;在指定的VLAN上启用生成树协议&#xff08;…

背包问题的模板及各个等价变形

目录 0-1背包 —— 二维二重循环 01背包 —— 一维二重循环 完全背包 —— 二维三重循环 完全背包 —— 二维二重循环 完全背包 —— 一维二重循环 0-1背包 —— 二维二重循环 #include <bits/stdc.h> using namespace std; const int N 1010; int dp[N][N]; int v…

Kali Linux 命令大全

一、引言 Kali Linux 作为一款专为渗透测试和安全研究设计的操作系统&#xff0c;拥有丰富的命令行工具&#xff0c;熟练掌握这些命令对于高效地进行安全测试和分析至关重要。本文将为您详细介绍 Kali Linux 中常用的命令&#xff0c;涵盖系统信息获取、文件操作、网络分析、用…

期权懂技巧分享:小细节决定成功的一切!

今天带你了解期权懂技巧分享&#xff1a;小细节决定成功的一切&#xff01;在期权交易市场中&#xff0c;有不少玩家胜率都只在50%左右&#xff0c;长期下来基本都是不赚不亏&#xff0c;甚至是有小额的亏损。 期权是一种金融衍生工具&#xff0c;它赋予持有人在未来某个时间以…

UWB定位系统常用的定位方法

UWB定位系统是一种无线定位技术&#xff0c;它使用超宽带无线电信号来确定移动设备的位置。与其他定位技术相比&#xff0c;UWB定位系统具有多种优势&#xff0c;例如高精度、低功耗、非视距定位能力和抗干扰能力强等。 UWB定位系统的工作原理是向移动设备发送一系列高频无线电…