UART串口通信

2023-05-16

目录

  • 一、通信特点
  • 二、通信应用
  • 三、接线示意图
  • 三、UART通信协议
  • 四、STM32F4 串口使用
    • 1、资源分布
    • 2、特性
    • 3、UART框图
    • 4、使用方法
    • 5、相关库函数
    • 6、函数实例
  • 五、实战《上位机控制开发板小灯》

一、通信特点

异步、串行、全双工

一般描述某种通信的特点为: 同步/异步 , 串行/并行 , 半双工/全双工
同步:要求一个芯片控制另一芯片的时序,一般,两者之间至少采用一个总线连接以控制时钟(“时钟线”),
其中主机主动控制时钟线(通过时钟线输出),从机被动接受时钟线(通过时钟线输入)。
异步:双方不会通过总线连接时钟,异步通信要求双方使用独立的时钟生成装置(波特率发生器),生成相 同的通信速度。
串行:在每个数据方向上仅有一根数据线。每次仅传输一位数据。 并行:在每个数据方向上有多根数据线。每次可以传输数据的多个位(一般是8/16位)
半双工:数据线仅有一组,同一时刻,只有一方控制数据线的发送,另一方接收数据(即双方不能同时发送 数据)
全双工:数据线有两组或以上,同一时刻,通信双方都可以给对方发送数据。
一种通信的特点与它的总线构成是相关的。

二、通信应用

  1. 部分无线通信模块具有UART通信接口,比如蓝牙模块、NBIOT模块、WIFI模块、GSM模块、GPS模块
  2. 是一种容易实现的MCU和电脑间的通信方式,用于辅助调试代码 (MCU传送变量、寄存器的值给电脑)
  3. 用于电脑控制MCU(电脑传送 指令数据 给MCU),通过上位机控制下位机

三、接线示意图

在这里插入图片描述
TX:发送引脚
RX:接收引脚

三、UART通信协议

一帧数据的构成:起始位+ 数据位 + 校验位 + 停止位
起始位:1位,逻辑’0’
数据位:5~8位,可以在MCU中设置
校验位:0~1位, 无校验/奇校验/偶校验
奇校验:在数据位中有奇数个逻辑‘1’时,该位为0;否则为1
偶校验:在数据位中有偶数个逻辑‘1’时,该位为0;否则为1
停止位:0.5~2位,(传输每个都会占用固定时长),逻辑‘1’
数据传输顺序:先传送数据的低位
通信速度(波特率baud):在单片机应用,常用通信速度有2400、4800、9600、19200、115200 bit/s

四、STM32F4 串口使用

1、资源分布

查看芯片的数据手册
一共有6个,分别是USART1和USART6挂载在APB2总线(84MHz)
USART2、USART3、UART4、UART5挂载在APB1总线(42MHz)

USART:表示通用同步异步收发器(由于其同步功能应用较少,一般不使用其同步功能)
UART :表示通用异步收发器

2、特性

查看芯片的参考手册 第26章 USART

主要特性:
同步\异步、串行、全双工
过采样倍数可以设置(16倍/8倍)
可以编程设置该接口的通信速度
数据字长度可编程(8 位或 9 位) (这里的数据字包含 数据位 + 校验位)
发送器和接收器具有单独使能位
传输检测标志:(通过查看这些标志,可以确定发生过的事件;若发生了这些事件,则该外设的状态寄存器SR的特定位会被置位)
— 接收缓冲区已满
— 发送缓冲区为空
— 传输结束标志
四个错误检测标志:(SR上有相应的位)
— 溢出错误
— 噪声检测
— 帧错误
— 奇偶校验错误
十个具有标志位的中断源(指该外设有最多10种可以触发中断的事件)

3、UART框图

在这里插入图片描述
结合框图和USARTx->CR1寄存器可以确定,对USARTx外设常见配置有:

  1. 数据帧格式设置(起始位、数据位、校验位、停止位)
  2. 通信速度设置
  3. 发送器和接收器使能
  4. 使能USARTx

框图中可以看出发送寄存器和接收寄存器共同构成DR(数据寄存器),CPU通过对USARTx->DR进行写/读操作可以分别实现发送/接收 数据。
由于串行通信传输一个字节数据需要一定的时间,在上一帧数据传输完成前,不可以立刻传送下一帧数据(强行传输会导致数据丢失)。所以在传输数据时,需要查询发送器/接收器状态,确认是否发生了 一帧数据传送完成 或 准备好接收一帧数据 的事件。

4、使用方法

在这里插入图片描述
当相应的GPIO引脚被复用为USRATx的Tx和Rx后,将由此USARTx外设控制这两个GPIO引脚,实现串口通信中的发送和接收(即这两个GPIO引脚将不再受到GPIOx->ODR等寄存器的影响了),开发板相关原理图如下。
在这里插入图片描述

5、相关库函数

附:引脚复用库函数
void GPIO_PinAFConfig (GPIO_TypeDef *GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF)
改变指定引脚的映射功能(复用功能)【该操作需要在将GPIO引脚配置为复用模式后使用】
比如,将PA9复用为USART1_Tx
(所有引脚的详细复用功能参考芯片数据手册 第3.7表格—复用功能映射)
GPIO_PinAFConfig (GPIOA, GPIO_PinSource9, GPIO_AF_USART1);

UART库函数
1、void USART_Init (USART_TypeDef *USARTx, USART_InitTypeDef *USART_InitStruct)
基于参数USART_InitStruct 初始化USARTx外设
2、void USART_Cmd (USART_TypeDef *USARTx, FunctionalState NewState)
USARTx外设使能
3、void USART_SendData (USART_TypeDef *USARTx, uint16_t Data)
通过串口发送数据(一个字节)
4、uint16_t USART_ReceiveData (USART_TypeDef *USARTx)
通过串口接收数据(一个字节)
5、void USART_ClearFlag (USART_TypeDef *USARTx, uint16_t USART_FLAG)
清除USARTx的挂起标志
6、FlagStatus USART_GetFlagStatus (USART_TypeDef *USARTx, uint16_t USART_FLAG)
查询USARTx的指定事件是否发生

6、函数实例

(1)初始化
USART1_init();

  1. 激活GPIOx时钟
  2. 将使用到引脚配置复用模式
  3. 将这些引脚映射到USARTx(此后,PA9和PA10作为USART1的发送和接收引脚)
  4. 激活USARTx时钟
  5. USARTx库函数初始化
    USART_Init ()
  6. 使能USARTx
    USART_Cmd ()
/***********************************
函数名:uart1_init
参数:u32 baud 波特率
返回值:无
功能:uart1初始化
备注:pa9 (usart1_tx)
			pa10(usart1_rx)
***********************************/
void uart1_init(u32 baud)
{
		//创建一个清单
	GPIO_InitTypeDef gpio_InitStruct;
	USART_InitTypeDef usart_InitStruct;
	
	/*将PA9,PA10作为USART1的Tx和Rx*/
	//1.激活GPIOA时钟
	RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE);
	//2.配置PA9和PA10为复用模式
		//填写清单
	gpio_InitStruct.GPIO_Mode = GPIO_Mode_AF ;
	gpio_InitStruct.GPIO_OType = GPIO_OType_PP ;
	gpio_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 ;
	gpio_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
	gpio_InitStruct.GPIO_Speed = GPIO_Low_Speed ;
		//导入清单,完成配置
	GPIO_Init (GPIOA, &gpio_InitStruct);
	//3.将PA9和PA10映射到USART1
	GPIO_PinAFConfig (GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
	GPIO_PinAFConfig (GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
	/*激活,初始化,使能USART1*/
	//4.激活USART1
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1, ENABLE);
	//5.配置USART1
		//填写清单
	usart_InitStruct.USART_BaudRate 						= baud ;
	usart_InitStruct.USART_HardwareFlowControl 	= USART_HardwareFlowControl_None ;
	usart_InitStruct.USART_Mode 								= USART_Mode_Rx | USART_Mode_Tx ;
	usart_InitStruct.USART_Parity 							= USART_Parity_No ;
	usart_InitStruct.USART_StopBits 						= USART_StopBits_1 ;
	usart_InitStruct.USART_WordLength 					= USART_WordLength_8b ;
		//导入清单,完成配置
	USART_Init (USART1, &usart_InitStruct);
	//6.使能USART1
	USART_Cmd (USART1, ENABLE);
}

(2)发送一个字节

/***********************************
函数名:uart1_sendByte
参数:u8 data 待发送内容
返回值:无
功能:通过串口1发送单字节
备注:等待发送完成
***********************************/
void uart1_sendByte(u8 data)
{
	//1.往DR写入数据
	USART_SendData (USART1, data);
	//2.等待本帧的数据位发送完成,清除标志位
	while(SET != USART_GetFlagStatus (USART1, USART_FLAG_TXE));
	//之后对DR进行写操作,TXE标志位自动清除
}

(3)发送一个字符串

/***********************************
函数名:uart1_sendString
参数:const char *str 指向待发送的字符串
返回值:无
功能:通过串口1发送字符串
备注:字符串(多次调用发送单字节函数)
调用次数 和 字符串长度有关
***********************************/
//(const) char *p / char str[] / (const) u8 *p / u8 str[]
void uart1_sendString(const char *str)
{
	//多次调用发送单字节函数
	while(*str != '\0')
	{
		uart1_sendByte(*str);
		str++;
	}
	//由于上方结构未发送'\0',补发'\0'
	uart1_sendByte('\0');
}

(4)接收一个字节

/***********************************
函数名:uart1_recvByte
参数:无
返回值:u8 接收到数据
功能:通过串口1接收单字节
备注:等待可以接收
			该函数具有阻塞特性
***********************************/
u8 uart1_recvByte(void)
{
	//1.等待可以接收一帧数据,考虑清除标志位
	while(SET !=  USART_GetFlagStatus (USART1, USART_FLAG_RXNE));
	//2.USARTx库函数接收数据,清除RXNE标志位
	return USART_ReceiveData (USART1);
}

(5)接收一个字符串

/***********************************
函数名:uart1_recvString
参数:char *p 指向接收字符串的空间
返回值:无
功能:通过串口1接收字符串
备注:等待可以接收
			该函数具有阻塞特性
若接收电脑端XCOM发送字符串,由于该软件
无法发送字符串,但可以勾选发送新行
***********************************/
void uart1_recvString(char *p)
{
	u8 data;
	do
	{
		//调用接收单字节函数
		data = uart1_recvByte();
		*p = data;
		p++;
	}
	while( (data != '\0') && (data != '\n') );//&& (data != '\n') 若不是电脑端发送可以不要
	//!((data == '\0') || (data == '\n'))
	*p = '\0';	//补充接收'\0'是考虑到会接收到'\n'的情况
}

五、实战《上位机控制开发板小灯》

思路:电脑通过串口与开发板相连,电脑通过串口发送指令(eg:LED_ON),开发板接收指令识别并进行LED灯的操作。
工程代码:
百度云链接:https://pan.baidu.com/s/1f3mj-WE-XMzHI-AMdW_oRg
提取码:aaaa

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UART串口通信 的相关文章

  • 蓝桥杯单片机学习过程记录(二十八)第五届国赛串口通信相关代码补充

    蓝桥杯单片机学习过程记录 二十八 第五届国赛串口通信相关代码补充 UART串口通信 第五届国赛uart串口内容相关补充 设置数组存储输入输入字符 并与设定的密码相判断 include
  • ESP-NOW无线通信

    本文由铁熊与默联合创作 在学习 Arduino 开发的过程中 无线通讯是我们学习道路上一道必过的坎 无线通讯摆脱了线材的束缚 使用更加灵活且通讯距离根据不同无线模块可达几十米甚至是数公里 常见的无线通讯方式有蓝牙 WiFi LoRa NB
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • Android 蓝牙串口通信Demo

    目录 一 前言 二 效果图 三 源码 带注释 1 布局代码 2 Java代码 3 权限声明 四 注意 五 项目源码下载 一 前言 在学校和机电的同学组队准备做一个智能小车去参加比赛 需要我开发一个小车的控制app 所以我开始学习蓝牙串口通信
  • verilog_串口实现

    verilog 串口实现 概述 先了解串口的基础知识 串口是怎样传数据的 什么是波特率 波特率怎么计算 说明 通过Verilog编写串口 通过逻辑分析仪与串口模块的对接来进一步了解串口的应用 文章目录 1 什么是波特率 波特率怎么计算 1
  • C#串口通信三步走

    第一步 实例化串口通讯类 SerialPort sp new SerialPort 第二步 设置串口信息并打开串口 串口设置 public void SetSP string PortName string BaudRate string
  • 硬件设计——外围电路(晶振电路)

    硬件设计之晶振电路 为什么要用晶振 晶振电路由何组成 晶振电路中其电容的作用 在日常的电路设计中 我们经常会用到晶振电路 所以我们就要首先先提一下什么是晶振 这样才能理解晶振电路 为什么要用晶振 晶振的作用是为系统提供基本的时钟信号 通常一
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • Ubuntu+Python环境做上位机

    最近需要制作程控电阻箱的上位机 使得大学毕业后就不再接触硬件的我无从下手 拿到机器后不知道怎么与其进行通信 Google上的资料也很少 现将我的环境搭建过程记录下来 希望对和我一样的小白有所帮助 软件环境 Ubuntu 16 04 pyth
  • CSerialPort教程4.3.x (6) - CSerialPort作为第三方库的使用

    CSerialPort教程4 3 x 6 CSerialPort作为第三方库的使用 环境 系统 windows 10 CentOS 7 cmake 3 22 1 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库
  • 奇偶校验位

    在串行通信中 奇偶校验位通常是由UART这样的接口硬件生成 校验的 在接收方 通过接口硬件中的寄存器的状态位传给 CPU 以及操作系统 错误数据的恢复通常是通过重新发送数据 这个过程通常由如操作系统输入输出程序这样的软件处理的
  • 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标

    修改Qt应用图标和窗口图标 GitHub源码 Qt串口调试助手下载 修改应用图标 首先选择一张喜欢的图片 来作为应用图标 图片格式必须为 ico easyicon net 有很多可供下载的资源 下载好后 将其放入工程目录 之后添加到 Qt的
  • 玩转ESP8266-01——AT指令集

    该指令集是接上一个 链接 初识AT指令 全部是根据本人在使用esp8266过程中用过的指令 可能有不全 有错误 还请理解指正 一起学习 AT指令集 一 基础指令 1 测试指令 2 复位指令 重启 二 设置指令 1 设置波特率 2 设置工作模
  • USB转串口那些事儿—USB转串口工作原理及应用

    一 简介 USB转串口即实现计算机USB接口到物理串口之间的转换 可以为没有串口的计算机或其他USB主机增加串口 使用USB转串口设备等于将传统的串口设备变成了即插即用的USB设备 USB虚拟串口应用特点 USB应用广泛 支持热插拔 传输速
  • Android usb通信 实现app与arduino通信demo

    Android usb通信 一 前言 二 开始 1 AndroidManifest xml清单文件 2 创建权限广播接收者 3 枚举usb设备 4 获取usb接口以及输入 输出端点 5 打开设备 6 设置波特率 7 创建接收数据的线程 8
  • QT串口助手的实现

    serial c include serial h include ui serial h serial serial QWidget parent QWidget parent ui new Ui serial ui gt setupUi
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 如何在R中从串口读取数据

    我想绘制来自串行端口的实时数据 我认为 R 将是完成这项工作的好工具 我在尝试从串行端口 COM4 读取数据时遇到了困难 我已经验证数据是通过 terra term 传入的 并在尝试 R 之前关闭会话 但我似乎无法在 R 中获取任何内容 我
  • 嵌入式Linux中UART上的9位协议

    我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议 目前我正在 am335x evm 板上对此进行测试 我计划使用坚持平价来做到这一点 理想情况下 我希望不需要实际修改 omap serial c 驱动程序的任何代码 9

随机推荐

  • 详解LVDS通信协议

    目录 LVDS概述LVDS接口电路的组成LVDS输出接口电路类型单路6位LVDS输出接口双路6位LVDS输出接口单路8位1TL输出接口双路8位1TL输出位接口 典型LVDS发送芯片介绍四通道LVDS发送芯片五通道LVDS发送芯片十通道LVD
  • 自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车

    目的 xff1a 一种廉价的跟随方案 xff0c 让大家都能够参与进来 xff0c 技术难度不大 xff0c 一些人也能够DIY一些属于自己的 跟随 机器人 xff01 并不是要做工业应用什么的 只是做出来玩玩 1 介绍 先看视频 xff0
  • 详解MIPI协议

    目录 前言MIPI简介MIPI联盟的MIPI DSI规范MIPI名词解释MIPI DSI分层结构command和video模式 D PHYLane模组Lane 全局架构Lane电压和状态DATA LANE操作模式时钟LANE低功耗状态高速数
  • 音频处理——详解PCM数据格式

    目录 知识储备什么是PCM采样采样率重采样 量化编码PCM常用指标 PCM数据流 知识储备 音频处理 音频编码原理简介 音频处理 音频处理的基本概念 什么是PCM PCM全称Pulse Code Modulation xff0c 翻译一下是
  • 音频处理——常用音频编码格式简介(PCM、G726、ADPCM、LPCM、G711、AAC)

    目录 PCMG726ADPCMLPCMG711AAC格式对比音频帧长音频播放过程 PCM 音频处理 详解PCM数据格式 音频处理 解析PCM格式实例 xff08 音量调控 xff09 G726 G 726是ITU T定义的音频编码算法 19
  • 音频处理——G711标准详解

    目录 G711简介G711A算法原理压缩方法举例代码 G711U算法原理压缩方法举例代码 G711A与G711U对比 参考链接 G711简介 G711是国际电信联盟ITU T定制出来的一套语音压缩标准 xff0c 它代表了对数PCM xff
  • PS流详解(载荷H264)

    目录 PS简介标准结构标准H264流结构定长音频帧和其他流式私有数据的结构 PS流封装标准PSH结构PES包结构PSM包结构体 元素流 PS 封装规则H264元素流封装规则音频元素流封装规则私有信息封装规则 PS简介 PS 封装方式需要支持
  • Postman中的authorization

    1 概述 Authorization是验证是否拥有从服务器访问所需数据的权限 当发送请求时 xff0c 通常必须包含参数 xff0c 以确保请求具有访问和返回所需数据的权限 Postman提供了授权类型 xff0c 可以轻松地在Postma
  • 操作pdf,提示startxref not found

    startxref not found多半是文件被损坏了 xff0c 检查一下 xff0c 是不是之前自己写的代码把pdf文件跑崩了 可以尝试重新生成一遍该pdf文件 xff0c 然后再进行操作 或者尝试一下 xff1a https www
  • FTP 530未登录

    提供一种思路 xff1a 如果说FTP服务器已开 xff0c 服务器也能ping通 就得考虑是不是我们在FTP服务器上设置的默认路径有问题 xff08 不符合我们的需求 xff09 Windows10下 xff0c FTP设置默认位置 xf
  • 开源个小demo

    https github com UnderADome epms 内部项目管理
  • LDAP的基本知识

    https zhuanlan zhihu com p 147768058 https www cnblogs com gaoyanbing p 13967860 html
  • 「权威发布」2019年电赛最全各类题目细节问题解答汇总

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 xff01 各位朋友大家上午好 xff0c 今天是比赛的第二天 xff0c 许多朋友都给我发消息 xff0c 我不是不回 xff0c 我实在是回不
  • Unable to find explicit activity class

    做项目从一个activity逐渐转向到使用多个activity xff0c 这个时候新手就容易出现一个问题 xff0c 忘了给activity在AndroidManifest xml中注册 打开日志 xff0c 在遇到这个报错信息的时候 x
  • Errors running builder 'Maven Project Builder'

    由于第一次玩maven的时候 xff0c 很多东西都还是懵懵懂懂 xff0c 不是很清楚 xff0c 不知道怎么把Myeclipse中的maven配置弄坏了 xff0c 从外部导入maven项目的时候 xff0c 总会报一些错误 xff1a
  • Type handler was null on parameter mapping for property '__frch_id_0'

    1 Type handler was null on parameter mapping for property frch id 0 2 Type handler was null on parameter mapping or prop
  • 如何解决error: failed to push some refs to 'xxx(远程库)'

    在使用git 对源代码进行push到gitHub时可能会出错 xff0c 信息如下 此时很多人会尝试下面的命令把当前分支代码上传到master分支上 git push u origin master 但依然没能解决问题 出现错误的主要原因是
  • expected an indented block

    Python中没有分号 xff0c 用严格的缩进来表示上下级从属关系 导致excepted an indented block这个错误的原因一般有两个 xff1a 1 冒号后面是要写上一定的内容的 xff08 新手容易遗忘这一点 xff09
  • C 实现TCP服务端(select、poll、epoll)

    使用C简单的实现一个tcp server xff0c 包括常规server 多线程实现server select实现server poll实现server epoll实现server IO模型原理可以看上一篇文章 常规模式 define M
  • UART串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描