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串口通信 的相关文章

  • STM32F1应用DMA——串口收发不定长数据

    STM32F1应用DMA 串口收发不定长数据 使用STM32自带DMA传输数据 可以减轻CPU负担 只需设置一些参数即可发送想要发送的数据 以下是STM32F1系列芯片测试过的部分代码 可实现DMA串口收发数据 下图来自STM32官网的手册
  • GD32E23x的USART被断点打断后重新运行,会一直进入中断的问题

    GD32E23x的USART被断点打断后重新运行 会一直进入中断的问题 GD32E230K8单片机USART0连接一个从机芯片 该芯片每100ms发来一串16Bytes的数据 MCU中断接收 没有开启FIFO 只开启了RBNE 接收缓存非空
  • 蓝桥杯单片机学习过程记录(二十八)第五届国赛串口通信相关代码补充

    蓝桥杯单片机学习过程记录 二十八 第五届国赛串口通信相关代码补充 UART串口通信 第五届国赛uart串口内容相关补充 设置数组存储输入输入字符 并与设定的密码相判断 include
  • 蓝牙mesh组网-JDY-24M初步探索

    操作步骤如下 这款JDY 24M蓝牙功能强大 我主要应用其中mesh组网这个功能 mesh组网简单来说 就是组网的这几个蓝牙是可以互相通信 一一通信是通过蓝牙地址来确定的 一 配置组网 需要用到两根USB转TTL的线 JDY 24M蓝牙2个
  • MicroPython串口数据转换技巧

    技巧一 还原从串口接收的HEX字符串 首先上官方文档 确认接收数据类型为bytes 串口读来的bytes类型HEX数据转换成HEX类型字符串转换函数 ByteToHex的转换 返回数据16进制字符串 def ByteToHex bins r
  • 用虚拟串口进行串口调试

    由于现在的笔记本电脑一般不带有串口 再进行串口调试时 可以用虚拟串口代替 虚拟串口下载链接 虚拟串口 Win7 下载 串口调试助手下载链接 串口调试助手 VS2010串口程序 使用的unicode库 纯API 不利用Mscomm控件 下载链
  • CSerialPort教程4.3.x (4) - CSerialPort在QT中的使用

    CSerialPort教程4 3 x 4 CSerialPort在QT中的使用 环境 QT 5 6 3 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Ja
  • stm32F103C8T6控制DHT11

    stm32F103C8T6控制DHT11串口打印 stm32F103C8T6控制DHT11串口打印学习经验总结 本人借鉴了许多大佬们的资料 这是个人学习的见解 如发现错误之处 麻烦指导指导 借鉴链接 https blog csdn net
  • 串口接收数据分包问题处理(QT上位机/单片机等)

    串口数据出现分包如何正确完整接收 提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 设计思路 二 代码参考 总结 前言 串口通信在QT上位机以及单片机或者安卓串口等使用情况下 经常容易出现一包数据分成几包
  • ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)

    测试第三课 ESP32 C3的串口通信测试 老样子 使用Enocean无线模块和ESP32 C3进行串口通信 目录 前言 1 UART示例测试 1 1 UART 基础测试 1 2 与Enocean无线模块串口通信测试 2 ESP32 C3
  • STM32F031串口(RS485)中断+DMA发送(预备知识)

    STM32F031串口 RS485 中断 DMA发送 前言 GPIO移植过程 与F1系列的一些区别 串口 DMA 前言 最近在搞STM32F031的项目 F0系列与常用的F1系列有一定区别 在开发过程中遇到一些问题 而且花了好长花间在搜寻解
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • 串口收发最高位为0

    串口收发最高位为0 昨天在现场 读取电表度数的时候发现一个问题 读取字节最高位不管多少全部为0 搞的我相当郁闷 最后没有办法 只好人工给他置1 今天到了公司打开 linux 程序设计 翻到终端这一章 152页 赫然写着几个大字 ISTRIP
  • 基于STM32F103RB的模拟液位检测告警系统(已实现)

    这次先看一下老朋友STM32 有关Zigbee的内容 Z stack协议栈和基于Zigbee的环境温湿度 烟雾传感器的环境监测系统 等有时间再更 基于STM32的模拟液位检测告警系统 记得好像是某一届蓝桥杯省赛题 基于STM32告警系统介绍
  • 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标

    修改Qt应用图标和窗口图标 GitHub源码 Qt串口调试助手下载 修改应用图标 首先选择一张喜欢的图片 来作为应用图标 图片格式必须为 ico easyicon net 有很多可供下载的资源 下载好后 将其放入工程目录 之后添加到 Qt的
  • Linux系统下使用socat将串口映射到TCP服务器端口

    首先需要安装socat 安装方法即是 apt get install socat 或 yum install socat 然后使用以下命令进行映射 socat TCP LISTEN 8899 fork reuseaddr FILE dev
  • IOError:[Errno 2]没有这样的文件或目录(当它确实存在时)Python [重复]

    这个问题在这里已经有答案了 我正在通过 python 中的 uart 传输文件文件夹 下面您可以看到简单的功能 但有一个问题 因为我收到如标题所示的错误 IOError Errno 2 No such file or directory 1
  • 如何在R中从串口读取数据

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

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

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1

随机推荐

  • 详解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 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描