串口(UART) 1 .UART概述

串口其实就是一种通信协议。
什么是通信协议?
通信双方在数据交流的过程中需要遵守的规则。

1.1 补充(常用通信协议分类及其特征介绍)

1. 同步、异步

同步:通信双方在同一个时钟脉冲下进行通信


异步:通信双方的时钟脉冲由各自提供

2. 单工、半双工、全双工

单工:在一个通信系统中,发送数据的一方叫发送发,接受数据的一方叫接受方,一旦角色确定下来后,永远不会改变。(遥控器)

半双工:在一个通信系统中,一个设备既可以作为发送方发送数据,也可以作为接收方接受数据,但是同一时刻只能拥有一种身份。----可以切换方向的单工 (对讲机)

全双工:在一个通信系统中,同一个设备同一时刻既是发送方,也是接收方,同时收发数据。(电话,手机)

3. 串行、并行

串行:只有一根数据线,数据一位一位地传输

并行:有多跟数据线,数据多位传输

4. 现场总线、板级总线

现场总线:没有固定在PCB板上的总线。( can )
板级总线:固定在PCB班上的总线。(串口、IIC、SPI)

UART原理示意图:

UART数据帧格式

启动位:
一个bit的低电平时间,一帧的数据的开始
数据位:
传输的有效数据,可以是5-8位
奇偶校验位:
当开启了奇偶校验功能时,数据位的最高位就作为奇偶校验位;如果不开启奇偶校验功能时,就不奇偶校验位。用于验证数据传输过程中是否有数据丢失。
奇偶校验精度只有50%。
CRC校验精度高达99.7%。
停止位:
1个位的高电平时间。(可设置成0.5、1、1.5、2bit)

一取数据位为8,不开奇偶校验,停止位为1。

UART四要素

  1. 数据位
  2. 奇偶校验位
  3. 停止位
  4. 波特率(bps):bit per second,每秒传输多少位数据。
    通信双方必须在同一个波特率下进行通信

2. STM32的UART

异步串行全双工

universal synchronous asynchronous receiver transmitter
  通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 USART 通过小数波特率发生器提供了多种波特率。
  它支持同步单向通信和半双工单线通信;还支持 LIN(局域互连网络)、智能卡协议与 IrDA(红外线数据协会) SIR ENDEC 规范,以及调制解调器操作 (CTS/RTS)。而且,它还支持多处理器通信。通过配置多个缓冲区使用 DMA 可实现高速数据通信。

STM32的UART特征(节选)

● 全双工异步通信
● NRZ 标准格式(标记/空格)
● 可配置为 16 倍过采样或 8 倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能
● 小数波特率发生器系统
— 通用可编程收发波特率(有关最大 APB 频率时的波特率值,请参见数据手册)。
● 数据字长度可编程(8 位或 9 位)
● 停止位可配置 - 支持 1 或 2 个停止位
● 传输检测标志:
— 接收缓冲区已满
— 发送缓冲区为空
— 传输结束标志

STM32的UART框架
框架分析


将框架划分成4个部分:

  1. 外部接口部分
    TX:数据发送管脚
    RX:数据接收管脚
    SW_RX:不属于标准串口
    nRTS:问对方忙不忙(不属于标准串口)
    nCTS:告诉对方你忙不忙(不属于标准串口)
    SCLK:在同步模式下发送同步信号的(不属于标准串口)

  2. 数据收发传输部分
    数据寄存器(DR)其实在内部分成两个寄存器,一个是用于发送的TDR寄存器,另一个是用于接收的RDR寄存器。我们对DR寄存器进行写操作时,实际上实在操作TDR寄存器,对DR寄存器进行读操作时,实际上是在操作RDR寄存器。
    串口接受数据:数据从RX管脚一位一位地传输到接受移位寄存器里面,当接受移位寄存器接受满了后,就会自动送上接受数据寄存器(RDR),硬件就会使接受满标志位置1,我们直接读取DR寄存器就可以读取到串口接收到的数据。
    串口发送数据:当发送缓冲区为空时,我们把要发送的数据直接写入到DR寄存器中,发送数据寄存器(TDR)就会将此数据传输到发送移位寄存器中,然后一位一位输出到TX端。

  3. 控制器部分
    通过配置发送控制器和接受控制器来控制数据收发传输过程。主要是配置CR1控制寄存器。

  4. 小数波特率部分

  5. 以USART1为例:
    fck=84Mhz.OVER8=0(过采样模式),波特率的值为bond.这些都是已知量。从此可以求出USARTDIV的值,将这个值写入到USART_BRR寄存器里面。

float USARTDIV;u32 DIV_Man;u32 DIV_Fra;
USARTDIV=84000000.0/(16*bond);
DIV_Man=USARTDIV;
DIV_Fra=(USARTDIV-DIV_Man)*16+0.5;
USART_BRR = DIV_Man<<4 | DIV_Fra;

注意:USART_BRR是寄存器,看手册

位 31:16 保留,必须保持复位值
位 15:4 DIV_Mantissa[11:0]:USARTDIV 的尾数
这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数
位 3:0 DIV_Fraction[3:0]:USARTDIV 的小数
这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。当 OVER8 = 1 时,不考虑 DIV_Fraction3
位,且必须将该位保持清零。

3.4 STM32的UART寄存器

3.4.1 状态寄存器 (USART_SR)

位 7 TXE:发送数据寄存器为空 (Transmit data register empty)
当 TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置 1。如果 USART_CR1 寄存器
中 TXEIE 位 = 1,则会生成中断。通过对 USART_DR 寄存器执行写入操作将该位清零。
0:数据未传输到移位寄存器
1:数据传输到移位寄存器
注意: 单缓冲区发送期间使用该位。

位 5 RXNE:读取数据寄存器不为空 (Read data register not empty)
当 RDR 移 位 寄 存 器 的 内 容 已 传 输 到 USART_DR 寄 存 器 时,该 位 由 硬 件 置 1。如 果
USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入
操作将该位清零。 RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使
用此清零序列。
0:未接收到数据
1:已准备好读取接收到的数据

3.4.2 数据寄存器 (USART_DR)
位 8:0 DR[8:0]:数据值

3.4.3 波特率寄存器 (USART_BRR)

3.4.4 控制寄存器 1 (USART_CR1)

位 15 OVER8:过采样模式 (Oversampling mode)
0: 16 倍过采样
1: 8 倍过采样
注意: 8 倍过采样在智能卡、 IrDA 和 LIN 模式下不可用:当 SCEN=1、 IREN=1 或 LINEN=1 时,
OVER8 由硬件强制清零。
位 13 UE: USART 使能 (USART enable)
该位清零后, USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软
件置 1 和清零。
0:禁止 USART 预分频器和输出
1:使能 USART
位 12 M:字长 (Word length)
该位决定了字长。该位由软件置 1 或清零。
0: 1 起始位, 8 数据位, n 停止位
1: 1 起始位, 9 数据位, n 停止位
注意: 在数据传输(发送和接收)期间不得更改 M 位
位 10 PCE:奇偶校验控制使能 (Parity control enable)
该位选择硬件奇偶校验控制(生成和检测)。使能奇偶校验控制时,计算出的奇偶校验位被
插入到 MSB 位置(如果 M=1,则为第 9 位;如果 M=0,则为第 8 位),并对接收到的数据
检查奇偶校验位。此位由软件置 1 和清零。一旦该位置 1, PCE 在当前字节的后面处于活动
状态(在接收和发送时)。
0:禁止奇偶校验控制
1:使能奇偶校验控制
位 3 TE:发送器使能 (Transmitter enable)
该位使能发送器。该位由软件置 1 和清零。
0:禁止发送器
1:使能发送器
注意: 1:除了在智能卡模式下以外,传送期间 TE 位上的“0”脉冲(“0”后紧跟的是“1”)
会在当前字的后面发送一个报头(空闲线路)。
2:当 TE 置 1 时,在发送开始前存在 1 位的时间延迟。

位 2 RE:接收器使能 (Receiver enable)
该位使能接收器。该位由软件置 1 和清零。
0:禁止接收器
1:使能接收器并开始搜索起始位

3.4.5 控制寄存器 2 (USART_CR2)
位 13:12 STOP:停止位 (STOP bit)
这些位用于编程停止位。
00: 1 个停止位
01: 0.5 个停止位
10: 2 个停止位
11: 1.5 个停止位

3.5 STM32的UART实验
PC通过串口发送数据给开发板,然后开发板通过串口接收到数据后回发给PC。

利用串口助手把数据从PC端发送到开发板

程序改进:
在demo1中,下载链接:https://download.csdn.net/download/qq_40860986/10962073
使用查询方式,查询接收缓冲区是否为空,不为空表示接收到数据完毕,将数据从数据寄存器保存到自己定义的char data;接收到马上发送出去。

demo2,使用串口中断,在中断完成收发,提高效率。但是有个问题,使用串口中断后并不知道串口接收在什么时候接收完成,需要在串口调试助手添加特殊结束符作为发送结束标志,当单片机接收到结束符,表示接收完成。下载链接:

u8 rev_buf[100];//接收缓冲区
u8 addr=0;     //地址偏移量
u8 revice_ok=0;//接收完成标志
//串口1中断服务函数
/*注意:
1.接收过程发生多次中断,并不是一次就接收完,PC端是一个字节一个字节的发送
单片机一个字节一个字节的接收,当发送完再读出一个完整的字符串。读取过程与
查询方式一样。
2.串口助手发送时,要以#做结尾,同时取消发送新行模式。*/
void USART1_IRQHandler(void)
{u8 data;data=USART1->DR;//读取同时会清除标志if(data=='#')//接收完成{rev_buf[addr]='\0';addr=0;revice_ok=1;}else//正常接收{rev_buf[addr++]=data;}}

demo3,使用串口中断,在中断完成收发,提高效率。取消用特殊标识符作为接收完成的标志。使用超时判断。(一个字节一个字节接收,每次接收计数值清零,当停止接收后,计数值不再清零,超过预设值就代表接收完成)
下载链接:

中断服务函数:

u8 rev_buf[100];//接收缓冲区
u8 addr=0;     //地址偏移量
u8 revice_ok=0;//接收完成标志
u8 revice_start=0;//开始接收受标志
u32 time_out=0;//超时计数值
//串口1中断服务函数
void USART1_IRQHandler(void)
{u8 data;data=USART1->DR;//读取同时会清除标志rev_buf[addr++]=data;revice_start=1;//开始接收time_out=0;//超级计数值清零
}

主函数判断:

     if(revice_start)//开始接收{Main_delay();time_out++;if(time_out>=50)//超时就{revice_ok=1;rev_buf[addr]='\0';addr=0;time_out=0;revice_start=0;}}

STM32F407ZGT6串口通信讲解相关推荐

  1. C语言串口通信R8T8,K60-串口通信

    目录 0x00 前言 0x01 串行通信原理 1.1 简单介绍 1.2 原理部分 1.2.1异步串行通信的数据格式 1.2.2 如何发送 (0/1) ? -- TTL电平 1.2.3 开始位/停止位/ ...

  2. 【转】Qt编写串口通信程序全程图文讲解

    Qt编写串口通信程序全程图文讲解 本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或 ...

  3. win Qt qextserialport 编写串口通信程序全程图文讲解

    转:http://blog.csdn.net/u010580186/article/details/51595227 (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果 ...

  4. 27.串口通信实验源码讲解

    串口通信实验源码讲解 笔记基于正点原子官方视频 视频连接https://www.bilibili.com/video/BV1Wx411d7wT?p=71&spm_id_from=333.100 ...

  5. Qt编写串口通信程序全程图文讲解

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三 ...

  6. python中select模块_基于python select.select模块通信的实例讲解 如何用python写个串口通信的程序...

    python socket怎么利用select实现双工通信 方法: Before : 0000000000000000000000000000000000000000 After pack: 0100 ...

  7. js 串口通信mscomm接收undefined_VB串口通信应用开发入门知识讲解

    VB是一门功能强大.简单易学的程序语言.它可以方便快捷地编制适用于数据处理.多媒体等方面的程序,而且利用ActiveX控件中的MSComm部件还能十分方便地开发出使用计算机串口的通信程序. 今天,我们 ...

  8. STM32F407ZGT6的串口通信

    处理器与外部设备通信的两种方式:并行通信和串行通信.这里我们一般讨论串行通信,而且我们实际应用中也是常用串行通信. 串行通信可分为:单工,半双工,全双工. 由上图可知,串口通信实际包含SPI,IIC, ...

  9. 【MATLAB】使用matlab进行串口通信(详细方法+代码讲解)

    整理时间:2020-05-19 目录: 1.matlab可以 进行串口通信? 2.怎么搞 3.总结 正文: 1.matlab可以 进行串口通信 matlab的toolbox很强大.其中Instrume ...

最新文章

  1. 易语言静态连接器提取_易语言静态编译链接器切换工具
  2. 一定是h的方式不对阅读_20T/H中水 超滤回用处理系统
  3. Android自定义圆形进度条
  4. 现在的网盘对开发都极度不友好
  5. 批处理的高吞吐率和高延迟的解释
  6. Kafka版本介绍Version2.4.0
  7. 用properties写的一个程序运行次数计数的程序代码,超过次数提示注册。
  8. go中defer的一个隐藏功能
  9. mp4 视频在网页上播放不了
  10. LDA(latent dirichlet allocation)的应用
  11. VBS 控制 Windos 系统音量 及视频播放
  12. 项目管理——项目汇报总结
  13. 学堂在线 UWP 首版
  14. Eclipse 下Struts 2.1.6+ 和spring 2.5.5 整合
  15. Java并发编程-Volatile和Syncronized关键字
  16. 面向大数据异构系统的神威并行存储系统
  17. 删除控制面板里面的java
  18. Echarts 开发静态数据模拟实现迁徙图步骤详解
  19. 代码随想录训练营day59
  20. js根据标签id获取其所有img

热门文章

  1. Ubuntu基本使用
  2. 大数据赋能司法新发展 政产学研嘉宾共聚清华
  3. 西安火车站进入扩建工程改造
  4. 71页国家电网企业架构及典型设计V1
  5. win7安装不了vmtools
  6. OpenGl ES---纹理
  7. GTLC非官方“服用”指南
  8. macbook m1安装pycharm
  9. 关系代数中除法的SQL实现
  10. Java对接钉钉开发第三方H5微应用详细教程