嵌入式通信协议-----UART协议详解(基于智芯Z20k11X)

news2024/12/22 19:17:15

目录

一、简介

1.概念

2.结构

3.特点

4.优缺点

二、协议帧组成 

1.起始位

2.数据位

3.奇偶校验位

4.停止位

三、UART通信过程

四、USART与UART区别

五、代码实现

1.硬件框图

2.软件实现


一、简介

1.概念

        USART(Universal Synchronous Asynchronous Receiver Transmitter,通用同步异步收发器)是一串行通信设备,可以灵活地与外部设备进行进行全双工信息交换。

         UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就能实现全双工通信。

        两者相似,UART是在 USART 的基础上裁剪了同步通信功能,只保留异步通信功能,我们平时使用的串口通信都是 UART。

2.结构

        任何 UART 双向通信至少需要 3 个引脚,数据发送引脚 TXD,数据接收引脚 RXD,数据参考地 GND。这里特别需要注意的是连接方法,设备 A 和设备 B 信号需要交叉连接。如果电平不同,需要电平转换芯片。

ARM芯片和PC机的电平不同需接入电平转换芯片如RS232 

这里解释下电平标准,根据使用使用的电平标准不同,可以分为 TTL 和 RS232 标准, 如图所示:

因为控制器一般都是 TTL 标准,因此如果需要进行 RS232 通信时,一定要使用 R232 转换器进行 TTL 和 RS232 的电平转换。

3.特点

①  空闲时,RXD 和 TXD 默认高电平

②数据起始位为低电平,低位在前,高位在后,串口数据一般为8位

③串口可选择是否开启数据校验,校验位:单个字节数据校验,对数据中高低电平数据个数进行计数,常见的有奇偶校验。

4.优缺点

优点:

  • 简单性:实现简单,硬件需求少。
  • 无时钟信号:无需设备之间的时钟同步。
  • 广泛支持:被微控制器和外围设备广泛支持。

缺点:

  • 距离限制:适用于短距离通信,长距离会受到噪声和信号衰减的影响。
  • 速度限制:与SPI或I2C等同步通信协议相比,数据传输速率较低。
  • 单设备通信:主要设计为点对点通信,若要多设备通信需要额外的电路。

二、协议帧组成 

在 UART中,传输模式为数据包形式。数据包由起始位、数据帧、奇偶校验位和停止位组成。

1.起始位

         用于指示数据传输的开始。接收器通过检测到逻辑低电平来识别传输的开始。不传输数据时保持高电平(1),开始传输数据后变为低电平(0)。

2.数据位

        实际传输的数据。数据位的长度可以在通信双方协商时设置,通常为5到9位(常见的是8位)。不使用奇偶校验位为9位。

3.奇偶校验位

        用于错误检测。常见的校验方式包括偶校验(Even Parity)和奇校验(Odd Parity)。偶校验时,数据帧中的1的个数为偶数;奇校验时,1的个数为奇数。如果奇校验时 ,而数据帧1的总和为偶数,或者偶校验时 ,而总和为奇数,则UART 认为数据帧中的位已改变。如果不用校验位,可以省略这一部分。

4.停止位

        指示数据传输的结束,并用于接收器同步和复位。停止位提供了一段时间让接收器准备好接收下一帧数据。发送 UART 将数据传输线从低电压驱动到高电压并保持1 到 2 位时间。

示例:

假设发送8位数据,没有校验位,1位停止位,数据为0x55(即二进制01010101),其UART帧结构如下:

| 起始位 |  数据位     |  停止位 |
|   0        | 01010101 |    1       |   

三、UART通信过程

发送器

  • 发送器开始发送起始位。
  • 紧接着发送数据位(从LSB到MSB)。
  • 如果启用了校验,发送校验位。
  • 最后发送停止位。

接收器

  • 接收器通过检测起始位(逻辑低)开始数据接收。
  • 按照预设的波特率,依次接收数据位。
  • 检查校验位(如果有)进行错误检测。
  • 检测到停止位(逻辑高)后,完成一帧数据的接收。

四、USART与UART区别

UARTUSART
配置和使用只需配置波特率、数据位、校验位和停止位,适用于简单的点对点通信除了和UART一样的配置外,还需要配置同步模式的时钟设置,适用于需要高精度、高速度的通信场合。
数据传输例如,9600波特率下,每秒可以传输9600个比特在同步模式下,可以通过更高的时钟频率实现更高的数据传输率

例子:

UART数据传输

  • 发送端:数据0x55(二进制01010101),波特率9600,无校验位,1个停止位。
  • 接收端:检测到起始位后,按配置的波特率读取数据位,校验(如果有),然后等待停止位。

USART数据传输(同步模式):

  • 发送端和接收端共享时钟信号。
  • 发送端:数据0x55(二进制01010101),时钟频率为1MHz。
  • 接收端:同步时钟信号,按时钟频率读取数据位,实现更高的传输速率。

五、代码实现

本次实验的效果是重定义printf函数输出Hello world!

1.硬件框图

2.软件实现

①初始化结构体

UART_Config_t tUartCfgStruct = 
 {
 9600,             /* 波特率选择*/
 UART_DATABITS_8, /* 数据位大小 */
 UART_PARITY_NONE, /* 奇偶校验位选择*/
 UART_STOPBITS_1, /* 停止位 */
 DISABLE,         /* 数据流控制 */
 40000000         /* 函数时钟频率选择 */
};
 /* 初始化结构体配置 */
UART_Init(UART1_ID, &tUartCfgStruct);

 ②串口接收函数

 unsigned char ch;
 /* 等待清除DR寄存器 */
 while (RESET == UART_GetLineStatus(UART1_ID,UART_LINESTA_DR));
/* 接收数据 */
 ch = UART_ReceiveByte(UART1_ID);

③串口发送函数

/* 等待状态寄存器TEMT复位 */
 while(RESET == UART_GetLineStatus(UART1_ID,
UART_LINESTA_TEMT));
 /* 发送数据ch */
 UART_SendByte(UART1_ID, ch);
 }
}

 ④重定义printf

unsigned char  ch[100];

int fputc(int ch, FILE *f)
{     
    (void) f; 
    /* Wait untill FIFO is empty */
	while(RESET == UART_GetLineStatus(UART1_ID, UART_LINESTA_TEMT))
    {
    }
    /* Send data */
    UART_SendByte(UART1_ID, (uint8_t)ch);     
	return ch;
}

代码简单的介绍了串口发送和接收的函数以及重定向printf进行打印,代码很简单所以没有放入完整代码,有学习使用智芯开发板的小伙伴们可以留言一起进行交流。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言常用易错记录

c语言常用易错记录 文章目录 c语言常用易错记录1.for循环 1.for循环 示例&#xff1a; #include <stdio.h>int main() {int i;for (i 0; i < 10; i) {printf("%d\n", i);}return 0; }执行顺序 备注&#xff1a;此图来源于b站鹏哥C语言视频课截图&#xf…

微软NVIDIA讲师直播讲解:探索LLM大模型的小型化 —— 小模型在NVIDIA Jetson 与 NIM 平台的最佳实践

Webinar主题&#xff1a;探索LLM大模型的小型化 —— 小模型在NVIDIA Jetson 与 NIM 平台的最佳实践 时间&#xff1a;6月25号 晚8点-9点 时长&#xff1a;1h 活动形式&#xff1a;线上 点击链接报名本次在线研讨会&#xff1a;https://www.nvidia.cn/webinars/sessions/?s…

7thonline第七在线受邀出席零售业卓越运营联盟(COER)2024

近期&#xff0c;一场汇集行业精英、探讨卓越运营的盛会——零售业卓越运营联盟&#xff08;COER&#xff09;2024论坛开幕。此次论坛吸引了全球众多零售业者的关注&#xff0c;7thonline第七在线创始人马克骏先生也应邀参与该论坛&#xff0c;共同探讨零售业的未来发展趋势。 …

Linux_应用篇(24) CAN 应用编程基础

本章我们学习 CAN 应用编程&#xff0c; CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一&#xf…

测评策略:提升美客多、亚马逊店铺排名的有效武器

在跨境电商平台上成功打造一家具有竞争力的店铺&#xff0c;特别是在美客多这样的知名平台上&#xff0c;确实需要卖家们投入大量的研究和精力进行精细运营。以下是我基于个人经验和深入研究&#xff0c;总结出的几个关键秘诀&#xff0c;旨在帮助卖家们提高销量并提升店铺的排…

React+TS前台项目实战(十四)-- 响应式头部导航+切换语言相关组件封装

文章目录 前言Header头部相关组件1. 功能分析2. 相关组件代码详细注释3. 使用方式4. Gif图效果展示 总结 前言 在这篇博客中&#xff0c;我们将封装一个头部组件&#xff0c;根据不同设备类型来显示不同的导航菜单&#xff0c;会继续使用 React hooks 和styled-components库来…

裸机写代码(Windows.Linux环境搭建)

目录 1.工具/原料 2.配置环境变量 2.1开发环境Windows搭建 2.1.1概述 2.1.1.1. 系统环境变量 2.1.1.2. 用户环境变量 2.1.1.3.根据你的实际情况选择配置用户变量还是系统变量&#xff0c; 2.1.1.4.环境变量各个变量名的作用 2.1.1.5.具体配置实例&#xff1a; 2.1.1.6…

[深度学习]循环神经网络RNN

RNN&#xff08;Recurrent Neural Network&#xff0c;即循环神经网络&#xff09;是一类用于处理序列数据的神经网络&#xff0c;广泛应用于自然语言处理&#xff08;NLP&#xff09;、时间序列预测、语音识别等领域。与传统的前馈神经网络不同&#xff0c;RNN具有循环结构&am…

【银河麒麟】云平台查看内存占用与实际内存占用不一致,分析处理过程,附代码

1.需求/问题描述 发现云平台查看内存占用与实际内存占用不一致。 2.分析过程 在系统中获取虚拟机内存使用率目前主要有两种方式&#xff0c;一种是通过virsh dommemstat获取&#xff0c;另外一种是通过qga接口获取。由于之前修复界面虚拟机cpu使用率时为qga接口获取&#xff…

安装VEX外部编辑器

Houdini20配置VEX外部编辑器方法_哔哩哔哩_bilibili 下载并安装Visual Studio Code软件&#xff1a;Download Visual Studio Code - Mac, Linux, Windows 在Visual Studio Code软件内&#xff0c;安装相关插件&#xff0c;如&#xff1a; 中文汉化插件vex插件 安装Houdini Expr…

八、yolov8模型预测和模型导出(目标检测)

模型查看 模型预测 模型导出 模型训练完成后&#xff0c;找到训练文件生成文件夹&#xff0c;里面包含wights、过程图、曲线图。 模型预测 1、在以下文件夹中放入需要预测的图&#xff1b; 2、找到detect文件下的predict.py文件&#xff0c;修改以下内容。 3、右键点击…

AI降重技术:论文查重率的智能解决方案

现在大部分学校已经进入到论文查重降重的阶段了。如果查重率居高不下&#xff0c;延毕的威胁可能就在眼前。对于即将告别校园的学子们&#xff0c;这无疑是个噩梦。四年磨一剑&#xff0c;谁也不想在最后关头功亏一篑。 查重率过高&#xff0c;无非以下两种原因。要么是作为“…

【编译原理】语法制导翻译

1.导入 语法制导翻译是处理语义的基本方法&#xff0c;它以语法分析为 基础&#xff0c;在语法分析得到语言结构的结果时&#xff0c;对附着于此结构 的语义进行处理&#xff0c;如计算表达式的值、生成中间代码等 2.语法与语义 语法与语义的关系 语法是指语言的结构、即语言的…

html5+css简易实现图书网联系我们页面

html5css简易实现图书网联系我们页面 完整代码已资源绑定

PD虚拟机支持M3吗 PD虚拟机怎样配置图形卡

最近有很多人在问M3芯片的苹果电脑和M2相比&#xff0c;有哪些提升的功能。实际上&#xff0c;M3芯片的苹果电脑拥有与M2相同的CPU与GPU数量&#xff0c;但比M2多50亿个晶体管&#xff0c;并引入了动态缓存、增强型神经网络引擎等技术&#xff0c;性能、功能均进一步加强。面对…

【motan rpc 懒加载】异常

文章目录 升级版本解决问题我使用的有问题的版本配置懒加载错误的版本配置了懒加载 但是不生效 lazyInit"true" 启动不是懒加载 会报错一次官方回复 升级版本解决问题 <version.motan>1.2.1</version.motan><dependency><groupId>com.weibo…

Kotlin设计模式:享元模式(Flyweight Pattern)

Kotlin设计模式&#xff1a;享元模式&#xff08;Flyweight Pattern&#xff09; 在移动应用开发中&#xff0c;内存和CPU资源是非常宝贵的。享元模式&#xff08;Flyweight Pattern&#xff09;是一种设计模式&#xff0c;旨在通过对象重用来优化内存使用和性能。本文将深入探…

LabVIEW程序闪退问题

LabVIEW程序出现闪退问题可能源于多个方面&#xff0c;包括软件兼容性、内存管理、代码质量、硬件兼容性和环境因素。本文将从这些角度进行详细分析&#xff0c;探讨可能的原因和解决方案&#xff0c;并提供预防措施&#xff0c;以帮助用户避免和解决LabVIEW程序闪退的问题。 1…

STM32学习-HAL库 串口通信

学完标准库之后&#xff0c;本来想学习freertos的&#xff0c;但是看了很多教程都是移植的HAL库程序&#xff0c;这里再学习一些HAL库的内容&#xff0c;有了基础这里直接学习主要的外设。 HAL库对于串口主要有两个结构体UART_InitTypeDef和UART_HandleTypeDef&#xff0c;前者…

【CT】LeetCode手撕—56. 合并区间

目录 题目1- 思路2- 实现⭐56. 合并区间——题解思路 3- ACM 实现 题目 原题连接&#xff1a;56. 合并区间 1- 思路 模式识别&#xff1a;合并区间 ——> 数组先排序 思路 1.先对数组内容进行排序 ——> 定义 left、right 根据排序后的结果&#xff0c;更新 right2.遍…