UART通信_深入理解(理论+实践)

news/2025/1/10 21:46:41/文章来源:https://www.cnblogs.com/yangyang13/p/18664776

UART通信_深入理解(理论+实践)

1. 理论知识

1.1 定义和概述

UART是 "通用异步收发器" ( Universal Asynchronous Receiver/Transmitter ) 的缩写,通常简称为UART。是一种异步串行通信接口,用于将数据通过串列通信进行传输。

1.2 硬件组成

常见的串口板会有四根线,VCC供电线、GND地线、TX数据发送端口、RX数据接收端口。使用上,GND连接保证两设备共地,有统一的参考平面;一方tx接另一方rx;vcc按需连接。
image-20250106093621862

1.3 工作原理

  1. 发送端将数据写入移位寄存器,然后发送数据帧;
  2. 接收端通过内部时钟信号控制,在每个时钟脉冲采样接收到的信号状态;
  3. 数据帧由起始比特、数据比特、奇偶校验和停止位组成;
  4. UART提供缓冲区存储接收的数据,并向处理器报告新数据可用。

串口参数及时序图:

波特率:串口通信的速率(发送和接收各数据位的间隔时间),每秒传输的bit数;
波特率通常是通过系统定时器转化而来:

校验位:用于数据验证;

停止位:用于数据帧间隔;

8位数据格式(LSB最低有效位,MSB最高有效位,一般默认地位优先传输):
image-20250106144842133

9位数据格式:
image-20250106144820701

串口模式图:

image-20250106145726884

1.4 主要特点

  1. 异步通信,不用同步信号;
  2. 串行通信,数据按比特顺序逐个发送,而不是像并行通信那样一次发送整个字节;
  3. 自动同步,接收端会自动识别数据帧的起始点;
  4. 可靠性高,有停止位和奇偶校验来检测传输错误;
  5. 低成本,单向只需要一根线就可进行通信,比并行通信硬件成本更低。

1.5 应用

  1. 手机设计和测试中控制CPU与其他部分的消息传送;
  2. 连接调制解调器(modem)的串口;
  3. PC机上的异步通信串口通信(COM接口);
  4. 嵌入式系统中的低成本串口通信解决方案。

1.6 补充说明

  1. UART串口通信指是硬件电路类型,具体电平通信协议通常是采用 TTL电平。

    TTL电平 :+5V 表示 1 ,0V 表示 0;

    RS232电平: -3 ~ -15V 表示 1 ,+3V ~ +15V表示 0;

    RS485电平:两线压差 +2 ~ +6V 表示 1 ,-2 ~ -6V 表示0;
    更多RS232协议相关内容见随笔:

  2. 由于电脑上大多数RS232接口的淘汰,现在大多采用串口板实现UART串口通信,其电路设计原理等相关内容见随笔:

  3. USART与UART的区别是多了同步通信功能;
    USART 通用同步异步收发机(Universal Synchronous Asynchronous Receiver Transmitter)

2. 实践验证

2.1 寄存器方式

验证的硬件环境:AI8051U实验箱 (STC公司产品,搭载当前最新的ai8051芯片)

2.1.1 串口相关寄存器

image-20250108213335449

image-20250108213721598

补充:

四种串口模式的特点应用场景如下:
  1. 同步位移串行方式
    特点:同步信号进行数据传输,数据位移位与同步信号对齐
    应用场景:高速数据传输,并且需要精确控制传输时间
  2. 可变波特率8位数据方式
    特点:波特率可变,数据帧为8位
    应用场景:计算机外设,嵌入式等,相对灵活,兼容性强
  3. 固定波特率9位数据方式
    特点:数据帧9位,多出的一位常用来作为地址/数据标识位或者奇偶校验,增加通信的可靠性或实现多机通信协议
    应用场景:对通信可靠性要求比较高的场景,如工业控制中的多点通信
  4. 可变波特率9位数据方式
    特点:波特率可变,9位数据帧,平衡了数据传输速率和数据完整性的要求
    应用场景:需要动态调整传输参数的应用,如智能传感器网络、复杂分布式控制系统

串口中断及波特率涉及到定时器,见随笔:

2.1.2 代码

main.c

/*************  功能说明    **************本例程基于AI8051U为主控芯片的实验箱进行编写测试。使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。串口1全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口1把收到的数据原样返回.下载时, 选择时钟 24MHz.******************************************/#include "ai8051u.h"		// 调用头文件
#include "stdio.h"			
#include "intrins.h"		
#include "UART.h"unsigned char srcc = 1;void Delay100ms(void)	//@24.000MHz
{unsigned long edata i;_nop_();_nop_();i = 599998UL;while (i) i--;
}/******************** 主函数 **************************/
void main(void)
{WTST = 0;  // 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快EAXFR = 1; // 扩展寄存器(XFR)访问使能CKCON = 0; // 提高访问XRAM速度P0M1 = 0x00;   P0M0 = 0x00;   // 设置所有IO口为准双向口P1M1 = 0x00;   P1M0 = 0x00;   P2M1 = 0x00;   P2M0 = 0x00;   P3M1 = 0x00;   P3M0 = 0x00;   P4M1 = 0x00;   P4M0 = 0x00;   P5M1 = 0x00;   P5M0 = 0x00;   P6M1 = 0x00;   P6M0 = 0x00;   P7M1 = 0x00;   P7M0 = 0x00;   Uart1_Init();while (1){P40 = 0;P0 = ~srcc;
//		UART_SendByte(srcc);
//		Delay100ms();
//		srcc++;}
}void Uart1_Isr(void) interrupt 4
{if (TI)				//检测串口1发送中断{TI = 0;			//清除串口1发送中断请求位}if (RI)				//检测串口1接收中断{srcc = (unsigned char)SBUF;UART_SendByte(srcc);RI = 0;			//清除串口1接收中断请求位}
}

UART.c

#include "ai8051u.h"void Uart1_Init(void)	//9600bps@24.000MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x40;		//定时器时钟1T模式AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器TMOD &= 0x0F;		//设置定时器模式TL1 = 0x8F;			//设置定时初始值TH1 = 0xFD;			//设置定时初始值ET1 = 0;			//禁止定时器中断TR1 = 1;			//定时器1开始计时ES = 1;				//使能串口1中断EA = 1;P_SW1 = (P_SW1 & ~0xc0) | 0x40;
}void UART_SendByte(unsigned char Byte)
{SBUF = Byte;while(TI);TI=0;
}

2.1.3 现象

  1. 单片机向上位机发送信息

    image-20250110155301852

  2. 上位机向单片机发送信息后返回
    串口界面:

    image-20250110153123662

    实验板子:0x45 :小端模式, 1010 0010

     		![image-20250110153429821](C:\Users\Thomas\AppData\Roaming\Typora\typora-user-images\image-20250110153429821.png)	
    

2.1.4 难点

  1. ai8051u这款芯片是最近才接触到的,它烧录程序用的是USB-UART形式,串口1和烧录口是同一引脚。一开始想着怎么在同一引脚完成串口通信,它烧录完后,串口自动掉了。USB-CDC模式也是首次了解,这个模式的源码啃了一天没啃下来(后续再深入学习)。后面在手册中找到了可以把串口1转移到其他引脚进行通信。
  2. 中断中不能操作寄存器,while循环中就可以,想把串口传的值直接在串口中断给到P0,P0直接没反应了。通过中间变量传递,在while中赋值就没事。

2.2 库函数方式(贴近实际的高效开发)

验证的硬件环境:洋桃开发版 (成品开发板可以省去手动接线)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

咸鱼学习第一天

markdown以及编辑器obsidian的学习 1 创建新笔记Ctrl+n Ctrl+o (可以快速打开需要的笔记;可以加文档名+笔记标题)2 文档属性设置 三个“---”可以添加日期、别名、标签 3 最常用语言一个’-‘加一个空格是一个小圆点 几个“#”+一空格就是几级标题 链接设置①:如我要在…

BurpSuite实操之重发器功能使用

手动操作来触发单独的HTTP请求,并进行应用程序响应的工具,此功能用于根据不同的情况修改和发送相后的请求并分析,通过调整Request的参数,不断尝试,通过Response查看状态,从而节省在浏览器中操作的时间。 在渗透测试过程中,我们经常使用Repeater进行请求与响应的消息验证…

G1原理—3.G1是如何提升垃圾回收效率

大纲 1.G1为了提升GC的效率设计了哪些核心机制 2.G1中的记忆集是什么 3.G1中的位图和卡表 4.记忆集和卡表有什么关系 5.RSet记忆集是怎么更新的 6.DCQ机制的底层原理是怎样的 7.DCQS机制及GC线程对DCQ的处理提升G1垃圾回收器GC效率的黑科技 G1设计了一套TLAB机制 + 快速分配机制…

1.10日学习笔记之C++的类

类其实就是一种数据类型,和结构相似。类的成员包括两类,属性(成员变量)和行为(成员函数)。 成员函数定义的两种方法(可能有多种,觉得这两种比较常用) 1、将类的成员函数定义在类体内,如 class CPerson {public: short age;short getage(){return age;}};2、将类的成…

着火智能监测识别摄像机

着火智能监测识别摄像机利用了先进的图像处理技术和人工智能算法,能够快速、准确地检测环境中的着火点,从而及时采取必要的安全措施。其工作原理如下:首先,摄像机配备高清摄像头,能够实时捕捉并传输环境图像。这些图像通过内置的处理单元,进行高效处理和分析。其次,利用…

BurpSuite实操之测试器功能

对web应用程序进行自动化攻击。此功能有多种用途,如漏洞利用、模糊测试、进行暴力pojie等1、目标设置代理发送过来请求的目标主机及端口信息。 输入要攻击的目标及端口2、位置设置在这个模块可以设置攻击的参数,及攻击使用的类型(1)Sniper-狙击手(2)Battering ram-破城锤…

采沙船智能监测识别摄像机

采沙船智能监测识别摄像机还支持数据记录和分析功能,可以生成详尽的非法采沙统计报告和趋势分析,为河流管理决策提供科学依据。管理部门可以通过监控系统的数据分析,制定精准的禁采政策和优化河流资源管理,有效保护水域生态环境,防止非法采砂对生态系统的破坏。在实际应用…

C api简单查询需要的几步

C api查询简单需要的几步 1.准备sql语句 2.绑定变量 通过sqlstatement类bindout方法将查询出来的值与存储他们的变量绑定。 这里绑定是为了以后从结果集中提取一行时只需要一行就可以完成将提取出 来的变量赋值。 3.执行execute 在这一步将sql语句执行。在这里有几个重点 mysql…

iterm2

外观 这个github上的项目提供了很多主题 https://iterm2colorschemes.com/ 亮色主题感觉还可以的几个: OneHalfLight、BuiltinLight、BlulocoLight、Materil、ProLight、Tango Half Adapted 下面截图是基于 Tango Half Adapted用蓝色代替青色,黄色加深之后的效果(vim括号插件…

22. MDI窗口设计

一、什么是MDI窗口MDI 窗口(Multiple-Document Interface),又称多文档界面,它主要用于同时显示多个文档,每个文档显示在各自的窗口中。MDI 窗口中通常包含子菜单和窗口菜单,用于在窗口或文档之间进行切换。用 QMainWindow 建立的主界面,通常会同时建立或打开多个相互独立…

详解:订单履约系统规划

大家好,我是汤师爷~ 什么是订单履约系统? 订单履约是从消费者下单支付到收到商品的全流程管理过程,包括订单接收、订单派单、库存分配、仓储管理和物流配送等环节,核心目标是确保商品准时、准确地送达消费者手中。 通过订单履约系统,消费者可以实时了解商品的物流状态和预…

文件单独编译生成

编译设备树也最好在 source过的那个窗口中来编译错误提示如下: 同时在makefile文件修改时也要注意