首页 > 其他分享 >UART通信_深入理解(理论+实践)

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

时间:2025-01-10 21:55:17浏览次数:1  
标签:UART void 0x00 实践 通信 串口 波特率

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](/i/l/?n=23&i=blog/3061933/202501/3061933-20250110214603913-1617442381.png)	
    

2.1.4 难点

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

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

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

标签:UART,void,0x00,实践,通信,串口,波特率
From: https://www.cnblogs.com/yangyang13/p/18664776

相关文章

  • UART/SPI/I2C 协议——(1)三者区别
    1. UART,SPI,I2C区别汇总特性UARTSPII2C通信方式串行、异步通信串行、同步通信串行、同步通信传输速率较低(9600-115200bps)高速(通常超过1Mbps)较慢(通常在100kbps到400kbps)引脚数量2根(TX和RX)4根(MOSI,MISO,SCLK,CS)2根(SDA,SCL)连接方式点对点通信主从模式(1主与......
  • M5Stack 发布全双工通信语音识别硬件;雷蛇发布 AI 游戏伴侣 Project AVA,实时指导复盘
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑......
  • 高效团队协作:在线工具在酒店管理中的实践
    1.酒店运营的复杂性与信息管理的挑战酒店行业是一个高度复杂和依赖信息的行业。从前台接待到客房服务,从市场营销到财务管理,每个环节都需要精准的数据对接与高效的沟通。然而,在传统管理模式下,信息传递通常依赖于邮件、电话或线下会议,不仅效率低下,还容易导致信息遗漏或延误。面对......
  • 使用Azure OpenAI实现检索代理的实践指南
    在当今的信息爆炸时代,如何高效地从巨量的数据中提取出有用的信息成为了技术领域的一个重要挑战。AzureOpenAI提供了一种强大的检索代理架构,能够在Arxiv等学术领域进行高效检索。在本篇文章中,我们将深入探讨如何利用Retrieval-Agent包,结合AzureOpenAI和LangChain,构建一个......
  • 目标客户营销(ABM)结合开源AI智能名片2+1链动模式S2B2C商城小程序的策略与实践
    摘要:在数字化营销日益盛行的今天,目标客户营销(AccountBasedMarketing,ABM)作为一种高度定制化的营销策略,正逐步成为企业获取高质量客户、提升市场竞争力的重要手段。与此同时,开源AI智能名片2+1链动模式S2B2C商城小程序作为一种创新的数字化营销工具,以其强大的数据分析、智能推......
  • 基于开源AI智能名片2+1链动模式S2B2C商城小程序的企业数字化转型深度策略与实践
    摘要:在大数据、人工智能等前沿技术的推动下,企业数字化转型已成为提升竞争力的关键路径。开源AI智能名片2+1链动模式S2B2C商城小程序作为一种创新工具,凭借其强大的数据分析、智能推荐及社交裂变能力,为企业提供了一个从用户洞察、产品优化到供应链管理的全方位解决方案。本文旨在......
  • C++ 文件操作入门到实践:轻松搞定逐行读取,助力期末作业与毕业设计!
    ......
  • NFC近场通信技术的功能
    NFC(近场通信)是一种短距离高频无线通信技术,允许电子设备在几厘米的范围内进行数据交换。以下是对NFC功能的详细解释:一、NFC的定义与特点定义:NFC技术,中文全称为近场通信技术,也叫“近距离无线通信”,诞生于2003年,由飞利浦和索尼这两个移动设备巨头联合研发,是在非接触式射频识别(RFID......
  • 基于Qt的OFD阅读器开发原理与实践
    摘要本文详细探讨了基于Qt开发OFD阅读器的原理与实践。通过解析OFD文件格式、构建文档结构、实现页面渲染、处理用户交互以及进行性能优化,本文展示了如何使用Qt框架开发一个功能强大、性能优异的OFD阅读器。文章还提供了示例代码和未来发展方向,为开发者提供了全面的参考和指导。......
  • 串口通信(CH340+CH9329)基础代码()
    //  串口向9329发送  键盘和鼠标信息==================//      BOOLOpenCom()打开串口//      voidSet_Com() 初始化串口参数//   intRead_Com()读串口数据// intWrite_Com()  写串口数据HANDLEhCom;//全局变量,串口......