串行通信协议——UART

2024-09-03 10:04
文章标签 uart 通信协议 串行

本文主要是介绍串行通信协议——UART,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发传输器)是一种广泛使用的串行通信协议,用于实现计算机与外设之间或两个计算机之间的数据传输。UART通信以异步方式进行,这意味着发送和接收设备不需要共享时钟信号。在嵌入式系统、工业控制、消费电子产品等领域,UART通信协议得到了广泛应用。

UART通信原理

UART通信基于RS-232标准,使用两条线进行数据传输:一条是发送线(TX),另一条是接收线(RX)。数据传输是异步的,每个字符的传输包括起始位、数据位、奇偶校验位(可选)和停止位。

  1. 起始位:数据传输开始前,发送方将线路拉低,表示传输即将开始。
  2. 数据位:紧随起始位之后,发送方发送数据。数据位的数量可以是5、6、7或8位。
  3. 奇偶校验位(可选):用于错误检测,可以是奇校验、偶校验或无校验。
  4. 停止位:数据位和奇偶校验位之后,发送方将线路拉高,表示字符传输结束。

UART通信特点

  • 异步通信:发送和接收设备不需要共享时钟信号。
  • 简单易用:只需要两条线(TX和RX)即可进行通信。
  • 成本低廉:硬件实现简单,成本较低。
  • 传输速率:速率通常在300bps到115.2kbps之间,但速率受到物理限制。

UART在嵌入式系统中的应用

在嵌入式系统中,UART通常用于以下场景:

  1. 调试和日志输出:通过UART将调试信息或日志输出到串行接口。
  2. 外设通信:与传感器、显示器等外设进行数据交换。
  3. 远程通信:通过UART与远程设备进行通信,如通过调制解调器进行电话线通信。

编写UART驱动

以下是一个简单的UART驱动示例,使用C语言编写,适用于嵌入式系统。

1. 初始化UART

首先,需要初始化UART硬件,设置波特率、数据位、停止位等参数。

#include <stdint.h>#define UART_BASE_ADDR 0x4000C000 // 假设UART基地址为0x4000C000
#define UART_DR        (*(volatile uint32_t *)(UART_BASE_ADDR + 0x00)) // 数据寄存器
#define UART_FR        (*(volatile uint32_t *)(UART_BASE_ADDR + 0x18)) // 状态寄存器void UART_Init(uint32_t baudrate) {// 假设系统时钟为72MHzuint32_t divisor = 72000000 / (16 * baudrate);// 设置波特率// 这里省略了具体的寄存器配置代码
}void UART_SendByte(uint8_t data) {while (UART_FR & (1 << 5)); // 等待发送缓冲区为空UART_DR = data; // 发送数据
}uint8_t UART_ReceiveByte() {while (!(UART_FR & (1 << 4))); // 等待接收缓冲区有数据return UART_DR; // 读取数据
}

2. 发送和接收数据

使用初始化函数设置好UART后,可以使用UART_SendByteUART_ReceiveByte函数发送和接收数据。

void UART_Transmit(const char *data, uint32_t size) {for (uint32_t i = 0; i < size; i++) {UART_SendByte(data[i]);}
}void UART_Receive(char *buffer, uint32_t size) {for (uint32_t i = 0; i < size; i++) {buffer[i] = UART_ReceiveByte();}
}

3. 应用示例

以下是一个使用UART发送和接收数据的示例。

#include <stdio.h>int main() {UART_Init(9600); // 初始化UART,设置波特率为9600const char *message = "Hello, UART!";UART_Transmit(message, strlen(message)); // 发送数据char buffer[100];UART_Receive(buffer, 100); // 接收数据printf("Received: %s\n", buffer);return 0;
}

注意事项

  • 在实际应用中,UART的初始化和配置可能需要根据具体的硬件平台进行调整。
  • 确保UART的波特率与接收设备匹配,否则可能导致通信错误。
  • 在多任务环境中,UART通信可能需要考虑同步和互斥问题。

通过上述内容,你应该对UART通信协议有了基本的了解,并能够编写简单的UART驱动程序。UART通信协议虽然简单,但在嵌入式系统和许多其他应用中仍然非常实用。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

这篇关于串行通信协议——UART的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132680

相关文章

笔记 14 : 彭老师课本第 8 章, UART : 寄存器介绍 ,

(99) 继续介绍 uart 的关于通道的 一整套 寄存器, UCON 等: ++ 接着介绍寄存器 UTRSTAT : ++ 接着介绍读写数据的寄存器: ++ 设置 uart 的波特率,有关的寄存器: ++ (100) (101) 谢谢

搭建SpringBoot+ Netty + WebSocket 通信协议框架

运用场景:与机器设备进行通讯或者其他场景; pom文件就不上传了,直接上代码,网上都可以找的到 主要是 SpringBoot 和 Netty 的依赖 1.配置类 @Component@ConfigurationProperties(prefix = "ws")public class WebSocketConfig {private int port;private String host

UART串口通信——FPGA学习笔记9

一、数据通信基本概念 按数据通信方式分类: 串行通信、并行通信 按数据传输方向分类: 单工通信、半双工通信、全双工通信 按数据同步方式分类: 同步通信、异步通信 常见的串行通信接口: 二、串口通信:         UART 是一种采用异步串行通信方式的通用异步收发传输器(universal asynchronous receiver-transmitter)

新路程------imx6的uart小结(1)

imx6用的是RS485,今天看看这个接口是怎么初始化的。 首先在./arch/arm/mach-mx6/board-mx6q_sabresd.c里找uart的相关信息 在static void __init mx6_sabresd_board_init(void)肯定会有初始化的相关信息 gpio_request(SABRESD_EPDC_PWRSTAT, "uart

新路程------hi3516a的uart rts cts功能

有位前辈写了以gpio方式控制rts,在驱动内核中修改http://blog.csdn.net/edw200/article/details/52251385?locationNum=4   就是在发送前拉高,发送后拉低,但是这样要计算时间,比较麻烦,而且不同的波特率容易时间计算不准确,所以还是应该由上层把这个事做了,也就是用ioctl的形式来做,这样比较安全放心。        r

AD7606工作原理以及FPGA控制验证(串行和并行模式)

文章目录 一、AD7606介绍二、AD7606采集原理2.1 AD7606功能框图2.2 AD7606管脚说明 三、AD7606并行模式时序分析以及实现3.1 并行模式时序图3.2 并行模式时序要求3.3 代码编写3.4 仿真观察 四、AD7606串行模式时序分析以及实现4.1 串行模式时序图4.2 串行模式时序要求4.3 代码编写4.4 添加仿真模型以及观察 一、AD760

电路笔记(通信):UART Universal Asynchronous Receiver/Transmitter+电缆信号完整性改善

UART协议概述 URAT(Universal Asynchronous Receiver/Transmitter)协议用于在两个设备之间进行数据传输。UART协议因其简单性和广泛应用而成为串行通信的一个基本选择,适合各种数据传输需求的应用。 异步传输 定义: UART是一种异步串行通信协议,这意味着数据在传输过程中不依赖于时钟信号,而是通过约定的波特率(baud rate)来同步数据传输。

【硬件操作入门】3--同步与异步、半双工传输、UART硬件介绍、bps速率计算

【硬件操作入门】3–同步与异步、半双工传输、UART硬件介绍、bps速率计算 文章目录 【硬件操作入门】3--同步与异步、半双工传输、UART硬件介绍、bps速率计算一、同步与异步1.1. 概念1.2 同步信号1.3 异步信号1.4 举个例子:红外遥控器解码器(异步)1.5. 同步与异步的差别 2、使用一线传输双向数据(半双工)2.1. 面临的问题2.2. 解决方法2.3. 双向传输示例

RK3568平台(UART篇)uart_driver 注册流程

一.串口子系统框架 串口子系统框架是 Linux 内核中专门用于处理串口设备的模块化框架: 在上图中,包含了多个层级,每个层级负责处理不同的功能和任务,从而实现串口设备的 完整驱动和管理。接下来依次介绍每个层级的作用。 应用层:位于最顶层,是串口子系统中用户空间应用程序与内核空间之间的接口,应用层 包括了用户空间的串口应用程序,如串口通信工具 minicom 等。 字符设备层:位于应用

浅谈通信协议设计

目录 1.设计原则 2.注意事项 2.1.大小端编码问题 2.2.字节对齐 2.3.显式指定整型字段的长度 2.4.涉及到浮点数要考虑精度问题,建议放大成整数或者使用字符串去传输 2.5.协议与自动升级功能 1.设计原则 设计通信协议时,需要考虑以下几个原则: 1) 简单性:协议设计应尽可能简单,简单的协议更易于实现和维护,减少出错的可能性。复杂的协议往往会导致理解和实现的