UART通信

一、UART通信的基础知识

  • 串行的(逐位发送,从低位到高位发送)。
  • 异步通信(接收方和发送方使用的时钟是不一样的)。
  • 全双工(可同时接收和发送)。

二、通信基础

  • 波特率:每秒传输bit的数量。用于描述通信的速度。
  • 高电平为1,低电平为0。
  • 数据位从低位到高位发送(倒着发)。
UART帧格式
UART空闲时为高电平。
帧格式为:起始位(0+ 数据位(5 - 8 bit) + 校验位(1位,可有可无)+停止位(1)。

例如:发送一个数据0x34 == (0011 0100),无校验位。
发送格式为:    1         0        0010 1100       1        1
             空闲位    起始位        数据位      结束位    空闲位

例如:发送一个数据0x78 == (0111 1000),无校验位。
发送格式为:     1          0       0001 1110         1        1
              空闲位     起始位       数据位         结束位    空闲位

三、硬件连线

  • 主机TX(发送) 连接 从机 RX(接收)。
  • 主机RX(接收) 连接 从机 TX(发送)。
  • 主机波特率和从机波特率需要保持一致。
UART全称通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),是一种通用串行数据总线,用于异步通信,可实现全双工传输和接收,广泛应用于微控制器和计算机之间的数据通信,如GPS模块、蓝牙模块、GSM模块等,也用于主机与辅助设备通信,通常被集成于其他通讯接口的连结上[^2][^3]。 UART工作时,数据按照二进制从低位到高位一位一位传输,能在串行通信与并行通信之间进行转换,实现与外部设备的全双工数据交换。两个UART可直接相互通信,发送端将来自控制设备(如CPU)的并行数据转换为串行形式,串行传输到接收端,接收端再将串行数据转换回并行数据供接收设备使用。数据从一个UART的发送引脚(Tx)流向另一个UART的接收引脚(Rx)。UART属于异步传输数据,没有时钟信号将发送的位输出与接收的位采样同步,发送与接收使用各自的时钟。发送端会将开始和停止位添加到传输的数据帧中,接收端通过数据帧中定义的开始位和结束位来确定何时开始读取这些位[^3]。 每个数据帧包含1个起始位、5到9个数据位(取决于UART的设置,若有奇偶校验位是5到8,没有则是5到9)、一个可选的奇偶校验位和1个或2个停止位。起始位方面,UART数据传输线在不传输数据时通常保持在高电平,要开始发送数据时,发送端UART先在一个时钟周期内将传输线从高电平拉到低电平,当接收端UART检测到从高到低的电压转换时,开始以设置好的波特率的频率读取数据帧中的位[^3]。 以下是一个简单的UART初始化和数据收发代码示例: ```c // UART初始化函数 void UART_Init(void){ // 将GPA1_0和GPA1_1设置为UART2的接收引脚和发送引脚,CPA1CON[0 - 7] GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0); // 设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 UART2.ULCON2 = UART2.ULCON2 & (~(0X7F << 0)) | (0X3 << 0); // 设置UART2的接收和发送模式为轮询模式 UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5 << 0); // 设置UART2的波特率为115200 UBRDIV2/UFRACVAL2 UART2.UBRDIV2 = 53; UART2.UFRACVAL2 = 4; } // UART发送字节函数 void UART_Send_Byte(void){ // 判断发送寄存器是否为空,为空则继续发送数据 while(!(UART2.UTRSTAT & (1 << 1))); // 将发送的数据写入发送寄存器 UART2.UTXH = 'A'; } // UART接收字节函数 char UART_Res_Byte(void){ char Dat = 0; // 判断寄存器是否接收到数据 if(UART2.UTRSTAT2 & 1){ Dat = UART2.URXH2; return Dat; } else{ return 0; } } int main(){ char RecDat = 0; UART_Init(); while(1){ RecDat = UART_Res_Byte(); if(RecDat == 0){ } else{ RecDat = RecDat + 1; UART_Send_Byte(); } } return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值