UART通信协议

news2024/10/6 3:00:50

什么是UART

   
UART ( Universal Asynchronous Receiver/Transmitter通用异步收发器) 是一种常用的串行通信协议,用于在 计算机和外部设备之间传输数据。它是一种异步通信协议,也就是说数据的传输不需要事先建立好同步时钟信号。 UART,是一种广泛应用于嵌入式领域的 串行异步、全双工通信协议。

UART 通信的一些关键参数包括:

  • 波特率(Baud Rate):数据传输的速率,通常以每秒位数(bps)来表示。常见的波特率有 9600、19200、38400、57600、115200 等。
  • 数据位(Data Bits):每个字符包含的数据位数,通常为 7 位或 8 位。
  • 停止位(Stop Bits):用于标记数据字符传输结束的位数,通常为 1 位或 2 位。
  • 奇偶校验(Parity):一种用于检测数据传输错误的机制。它可以设置为无校验(None)、奇校验(Odd)、偶校验(Even)或标记校验(Mark)等。

什么是同步、异步

同步:就是双方使用同一个时钟

同步通信要求通信双方共用同一时钟信号,在总线上保持统一的时序和周期完成信息传输。

优点:可以实现高速率、大容量的数据传输,以及点对多点传输。
缺点:要求发送时钟和接收时钟保持严格同步,收发双方时钟允许的误差较小,同时硬件复杂。
而异步通信不需要时钟信号,而是在数据信号中加入开始位和停止位等一些同步信号,以便使接收端能够正确地将每一个字符接收下来,某些通信中还需要双方约定传输速率。

优点:没有时钟信号硬件简单,双方时钟可允许一定误差。
缺点:通信速率较低,只适用点对点传输。

数据的传输方向

根据数据传输方向,通信又可分为全双工、半双工和单工通信。全双工、半双工和单工通信的比较如下图所示

单工是指数据传输仅能沿一个方向,不能实现反方向传输,如校园广播。

半双工是指数据传输可以沿着两个方向,但是需要分时进行,如对讲机。

全双工是指数据可以同时进行双向传输,比如日常的打电话。

数据通信方式

按数据通信方式分类,可分为串行通信和并行通信两种。串行和并行的对比如下图所示:

串行通信的基本特征是数据逐位顺序依次传输,优点是传输线少、布线成本低、灵活度高等优点,一般用于近距离人机交互,特殊处理后也可以用于远距离,缺点就是传输速率低。

而并行通信是数据各位可以通过多条线同时传输,优点是传输速率高,缺点就是布线成本高,抗干扰能力差因而适用于短距离、高速率的通信。

串行通信还需要用到第三个线,地线(GND)。

通信速率

传信率:每秒钟传输的信息量,即每秒钟传输的二进制位数,单位为bit/s(即比特每秒),因而又称为比特率。
传码率:每秒钟传输的码元个数,单位为 Baud(即波特每秒),因而又称为波特率。
波特率被传输的是码元,码元是信号被调制后的概念,每个码元都可以表示一定 bit 的数据信息量。比如说,在 TTL 电平标准的通信中,用 0V 表示逻辑 0,5V 表示逻辑 1,这时候这个码元就可以表示两种状态。如果电平信号 0V、2V、4V 和 6V 分别表示二进制数 00、01、10、11,这时候每一个码元就可以表示四种状态。

由上述可以看出,码元携带一定的比特信息,所以比特率和波特率也是有一定的关系的。比特率和波特率的关系可以用以下式子表示:

其中 M 表示码元承载的信息量,也可以理解为 M 为码元的进制数。

例:波特率为 100 Baud,即每秒传输 100 个码元,如果码元采用十六进制编码(即 M=16,代入上述式子),那么这时候的比特率就是 400 bit/s。如果码元采用二进制编码(即 M=2,代入上述式子),那么这时候的比特率就是 100 bit/s。

1. 串口采用串行通信方式

        因为收发数据收发时,一个时钟周期,只能收发一位数据

2. 波特率(bps:比特率,二进制/秒,比特/秒)

        串口通信时,传输的速率,1s钟能够收发数据的位数

        115200bps:表示1s钟可以收发 115200bit数据

        波特率倒数:传输每位所需要的时间

 

UATR帧格式

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

波形图: 

1.空闲态: UART总线不在传输数据的时候,总线处于空闲状态,为高电平

2.起始信号 开始信号,串口通信的开始标志位

3.数据位 串口发送数据,先发低位,再发高位

4.奇/偶校验位:校验数据是否正确

        奇校验:数据位和校验位1的个数为奇数 假设数据位0x55(0101 0101),校验位1 假设数据位0x51(0101 0001),校验位0

        偶校验:数据位和校验位1的个数为偶数 假设数据位0x55(0101 0101),校验位0 假设数据位0x51(0101 0001),校验位1

5.停止信号:发送数据结束,回到高电平状态,校准时钟信号 一帧数据发送结束后,需要校准时钟信号,为什么需要校准时钟信号呢? 因为串口采用的是异步通信方式,双方都有自己独立的时钟源,虽然设置了双方的时钟源保持一致, 但是在发送数据时,每发送一帧数据时,都会产生误差,越往后,发送的数据,累计误差越大, 所以每发送一帧数据之后,需要校准时钟信

 

 需要用到的寄存器

 

 

 

 

 

代码实现 

#include<s3c2440.h>

void UART_init(void)
{
   //配置GPH2 3的引脚功能为TXD,RXD
   GPHCON &=~(0xf<<4);
   GPHCON |=(0xa<<4);

  			//		UART 线路控制寄存器
   ULCON0 &=~(1<<6);      //普通模式
   ULCON0 &=~(0x7<<3);	  //无校验
   ULCON0 &=~(1<<2);	   //1位停止位
   ULCON0 |=(0x3<<0);	   //8位数据位

   UCON0 &=~(0xf<<12);    //UART 控制寄存器	清0
   UCON0 |=(4<<12);		  //FCLK/10
   UCON2 |=(1<<15);		  //使能FCLK/n
   UCON0 |=(0x3<<10);	  //UART时钟选择为FCLK/n

   UCON0 &=~(0xf<<0);
   UCON0 |=(0x5<<0);	  //中断或轮询模式


   UBRDIV0	=259;		//UART 波特率分频寄存器	 波特率9600
}

unsigned char UART_rev(void)
{
     unsigned char info=0;
     while(!(UTRSTAT0 & (1<<0)));	//	UART TX/RX 状态寄存器
	 info=URXH0;			//	 UART 接收缓冲寄存器
	 return info;  
}

void UART_send(unsigned char info)
{
    while(!(UTRSTAT0&(1<<2)));
	UTXH0=info;     //					UART 发送缓冲寄存器
}

没有缓冲区:一次发送的数据多时,会丢包

加入缓冲区后

#include<s3c2440.h>

void UART_init(void)
{
   //配置GPH2 3的引脚功能为TXD,RXD
   GPHCON &=~(0xf<<4);
   GPHCON |=(0xa<<4);

  			//		UART 线路控制寄存器
   ULCON0 &=~(1<<6);      //普通模式
   ULCON0 &=~(0x7<<3);	  //无校验
   ULCON0 &=~(1<<2);	   //1位停止位
   ULCON0 |=(0x3<<0);	   //8位数据位

   UCON0 &=~(0xf<<12);    //UART 控制寄存器	清0
   UCON0 |=(4<<12);		  //FCLK/10
   UCON2 |=(1<<15);		  //使能FCLK/n
   UCON0 |=(0x3<<10);	  //UART时钟选择为FCLK/n

   UCON0 &=~(0xf<<0);
   UCON0 |=(0x5<<0);	  //中断或轮询模式


   UBRDIV0	=259;		//UART 波特率分频寄存器	 波特率9600

   UFCON0 |=(1<<0);    //使能FIFO
   UFCON0 |=(1<<1);	   //复位RX FIFO
}

unsigned char UART_send(unsigned char*info,unsigned char len)
{
    int i=0;
	for(i=0;i<len;i++)
	{
	    while(!UTRSTAT0 &(1<<2));
		UTXH0=info[i];
	}
	return i;
}

unsigned char UART_recv(unsigned char * info, unsigned char len)
{
    int i=0;
	unsigned char count= UFSTAT0 &0x3f; //前5位为数据量,保留前5位
	unsigned char num = (count < len) ? count : len;
	for(i = 0; i < num; i++)
	{
		info[i] = URXH0;
	}

	return num;
}

加入中断、超时中断功能

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

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

相关文章

Unity MVC框架演示 1-1 理论分析

本文仅作学习笔记分享与交流&#xff0c;不做任何商业用途&#xff0c;该课程资源来源于唐老狮 1.一般的图解MVC 什么是MVC我就不说了&#xff0c;老生常谈&#xff0c;网上有大量的介绍&#xff0c;想看看这三层都起到什么职责&#xff1f;那就直接上图吧 2.我举一个栗子 我有…

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…

Vue的基本用法及模板语法

Vue.js使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue实例的数据。所有 Vue.js的模板都是合法的 HTML&#xff0c;所以能被遵循规范的浏览器和 HTML 解析器解析。 在底层的实现上&#xff0c;Vue将模板编译成虚拟 DOM 渲染函数。结合响应系…

实现Xshell与虚拟机中Linux服务器的连接(附常见错误解决)

前言 Xshell是一个强大的安全终端模拟软件&#xff0c;它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。Xshell 通过互联网到远程主机的安全连接以及它创新性的设计和特色帮助用户在复杂的网络环境中享受他们的工作。 本文将介绍Xshell与虚拟机中Linux服务器连接…

前缀线性基——关于目前的理解以及一些样题

怎么说呢&#xff1f;在前几天我总结了了有关线性基的一篇博客&#xff0c;线性基用来去求整个区间的异或最值问题 前缀线性基——用于统计一个区间内的异或最值问题 那么我们如何去统计呢&#xff1f;那么就要去存储一个区间的异或空间线性基&#xff0c;因此我们的思路就是用…

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

平衡二叉搜索树之 AVL 树的模拟实现【C++】

文章目录 AVL树的简单介绍全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert[重要]当parent的平衡因子为1/-1时&#xff0c;如何向上更新祖先节点的平衡因子呢&#xff1f;怎么旋转&#xff1f;左单旋右单…

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT

Windows Ubuntu下搭建深度学习Pytorch训练框架与转换环境TensorRT JetBrains2024&#xff08;IntelliJ IDEA、PhpStorm、RubyMine、Rider……&#xff09;安装包Anaconda Miniconda安装.condarc 文件配置镜像源查看conda的配置和源(channel)自定义conda虚拟环境路径conda常用命…

Chromium 中JavaScript Screen API接口c++代码实现

Screen - Web API | MDN (mozilla.org) Screen Screen 接口表示一个屏幕窗口&#xff0c;往往指的是当前正在被渲染的 window 对象&#xff0c;可以使用 window.screen 获取它。 请注意&#xff1a;由浏览器决定提供屏幕对象&#xff0c;此对象一般通过当前浏览器窗口活动状…

《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学

希望这个下集里能有完整的代码 一、containsPoint实现 先从网上找一下Statement expected, found Py:DEDENTTAB还是空格呢??小小总结如何拆分矩形的四个点呢.我们来小小的测试一下这个函数结果出在哪里呢???修改完成variable in function should be lowercase 函数变量应该…

No.2 笔记 | 网络安全攻防:PC、CS工具与移动应用分析

引言 在当今数字化时代,网络安全已成为每个人都应该关注的重要话题。本文将总结一次关于网络安全攻防技术的学习内容,涵盖PC端和移动端的恶意程序利用,以及强大的渗透测试工具Cobalt Strike的使用。通过学习这些内容,我们不仅能够了解攻击者的手法,更能提高自身的安全意识和防…

【牛顿迭代法求极小值】

牛顿迭代法求极小值 仅供参考 作业内容与要求 作业内容 作业要求 递交报告 代码 编程实现 计算偏导数 故上述非线性方程组的根可能为 f ( x , y ) f(x, y) f(x,y)的极值点&#xff0c;至于是极小值点还是极大值点或鞍点&#xff0c;就需要使用微积分中的黑塞矩阵来判断了。…

网络基础 【HTTPS】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a; &#x1f4bb;操作环境&#xff1a; CentOS 7.6 华为云远程服务器 &#x1f339;关注我&#x1faf5;带你学习更多Linux知识…

Linux之实战命令26:timeout应用实例(六十)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

安卓手机密码忘了怎么办?(只做科普)

注意&#xff1a;只做科普&#xff0c;拒绝利用技术做一些非法事情 科普人&#xff1a;网络安全工程师~DL 科普平台&#xff1a;快手&#xff0c;CSDN&#xff0c;微信公众号&#xff0c;小红书&#xff0c;百度&#xff0c;360 本期文章耗时比较大&#xff0c;如果喜欢&…

数学题-分糖果-答案解析

PDF文档回复:20241005 1[题目描述] 幼儿园有7个小朋友&#xff0c;你是其中之一&#xff0c;有一天你发现无穷多颗糖&#xff0c;最少可以拿16个&#xff0c;最多可以拿23个&#xff0c;你打算拿一些分给小朋友们&#xff0c;分配原则是如果每人(包括你)都可以拿1块糖&#xf…

快速上手C语言【上】(非常详细!!!)

目录 1. 基本数据类型 2. 变量 2.1 定义格式 和 命名规范 2.2 格式化输入和输出&#xff08;scanf 和 printf&#xff09; ​编辑 2.3 作用域和生命周期 3. 常量 4. 字符串转义字符注释 5. 操作符 5.1 双目操作符 5.1.1 算数操作符 5.1.2 移位操作符 5.1.3 位操作符…

IDEA下“File is read-only”可能原因及“找不到或无法加载主类”问题的解决

1.File is read-only”可能原因 写代码时想要修改这个静态变量的值&#xff0c;把这个语句注释掉&#xff0c;发现在这个文件中File is read-only无法编辑修改&#xff0c;于是想去掉这个状态 网上查看的解释大多是在File栏目或File->File Properties下可以找到Make File W…

Git介绍--github/gitee/gitlab使用

一、Git的介绍 1.1、学习Git的原因&#xff1a;资源管理 1.2、SCM软件的介绍 软件配置管理(SCM)是指通过执行版本控制、变更控制的规程&#xff0c;以及使用合适的配置管理软件来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护。 二、版本控制软件 …

常见的基础系统

权限管理系统支付系统搜索系统报表系统API网关系统待定。。。 Java 优质开源系统设计项目 来源&#xff1a;Java 优质开源系统设计项目 | JavaGuide 备注&#xff1a;github和gitee上可以搜索到相关项目