UART

news/2024/11/15 1:38:49/文章来源:https://www.cnblogs.com/izxw/p/18393527

UART协议帧

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

  数据帧

起始位

  当不传输数据时, UART 数据传输线通常保持高电压电平。若要开始数据传输,发送UART 会将传输线从高电平拉到低电平并保持1 个时钟周期。当接收 UART 检测到高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。

  起始位

数据位

  数据帧包含所传输的实际数据。如果使用奇偶校验位,数据帧长度可以是5 位到 8 位。如果不使用奇偶校验位,数据帧长度可以是9 位。在大多数情况下,数据以最低有效位优先方式发送。

  数据位

奇偶校验位

  校验位可以配置成 1 位偶校验或 1 位奇校验或无校验位。接收UART 读取数据帧后,将统计数值为 1 的位,检查总数是偶数还是奇数。如果奇偶校验位为0 (偶数奇偶校验),则数据帧中的1或逻辑高位总计应为偶数。如果奇偶校验位为 1 (奇数奇偶校验),则数据帧中的1 或逻辑高位总计应为奇数。当奇偶校验位与数据匹配时,UART 认为传输未出错。但是,如果奇偶校验位为0 ,而总和为奇数,或者奇偶校验位为 1 ,而总和为偶数,则UART 认为数据帧中的位已改变

  校验位

停止位

  为了表示数据包结束,发送 UART 将数据传输线从低电压驱动到高电压并保持1到2位时间。

  停止位

串口工作过程

  1. 当串口信号处于空闲位时,不需要发送数据,串口一直处于高电平状态
  2. 当需要发送数据时,将串口电平拉低一位,此时串口处于起始位,表示需要发送数据
  3. 发送完8位数据后(可以选择无校验),接着有一位停止位将电平拉高表示发送结束,再留一个空闲位,空闲位过后发送下一个数据帧
  4. 所以串口发送数据的效率只有80%

串口配置 

 //在使用串口通信之前需要先配置串口,在使用串口同时也要使用引脚,所以也要配置端口工作模式,需要使用引脚时配置引脚工作模式永远排在第一位
//配置GPIO端口工作模式函数
void GPIO_Config(){GPIO_InitTypeDef init;init.Mode = GPIO_PullUp;init.Pin = GPIO_Pin_0 | GPIO_Pin_0;//我们使用的引脚是P30和P31GPIO_Inilize(GPIO_P3,&init);//我们使用的端口是第3组
}
//串口配置函数
void UART_Config(){COMx_InitDefine init;init.UART_Mode = UART_8bit_BRTx;//传输模式配置init.UART_BRT_Use = BRT_Timer1;//波特率发生器init.UART_BaudRate = 115200;//波特率配置init.UART_RxEnable = ENABLE;//允许接收init.Morecommunicate = DISABLE;//多机通讯允许, ENABLE,DISABLEinit.BaudRateDouble = DISABLE;//波特率加倍UART_Configuration(UART1,&init);//这里的UART1是指支持UART协议的端口分组NVIC_UART1_Init(ENABLE,Priority_1);//配置UART1的中断使能,配置中断优先级UART1_SW(UART1_SW_P30_P31);//引脚切换配置
}
void main(){GPIO_Config();UART_Config();//打开全局中断开关EA = 1;TX1_write2buff(97);//MCU使用串口1发送97给PC,对应字符awhile(1);
}
//现在已经配置好了串口,PC和单片机已经可以互相发送数据了,但是由于单片机不能像PC一样给用户一个直观的反馈所以我们需要通过串口通信将PC发送给单片机的数据发送回电脑,来验证能互相通信
//需要在while循环内加上以下代码
//单片机每个串口都有数据寄存器SBUF和存放数据的数组RX1_Buffer[128],当PC发送数据过来时,串口会用SBUF将数据移动到数组中,所以检验PC发送个单片机数据有没有成功,就看数组中有没有发送的数据即可
if(COM1.RX_Cnt > 0 && --COM1.RX_TimeOut == 0){//COM1.RX_Cnt是单片机中存放数据的数组的已经存放的长度标志,COM1.RX_TimeOut是一个计数功能,能够保证发送数据的连续性for(i = 0;i < COM1.RX_Cnt;i++){//遍历单片机中存放数据的数组,通过串口1发送回给PCTX1_write2buff(RX1_Buffer[i]);}COM1.RX_Cnt = 0;//取完数据之后将数组中长度标志置零,如果不置零,下次PC发送过来的数据就会继续往后存
}

多机通信

//PC1,PC2
void main(){int i = 0;GPIO_Config();UART_Config();EA = 1;while(1){if(COM1.RX_Cnt > 0 && --COM1.RX_TimeOut == 0){for(i = 0;i < COM1.RX_Cnt;i++){TX2_write2buff(RX1_Buffer[i]);//使用串口2将串口1的数组里面的数据拷贝到串口2的数组中TX1_write2buff(RX2_Buffer[i]);//同步输出串口1数组中的数据,可以随时打印对方PC发送给单片机的数据}COM1.RX_Cnt = 0;}delay_ms(20);}
}
void GPIO_Config(){GPIO_InitTypeDef init;init.Mode = GPIO_PullUp;init.Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_Inilize(GPIO_P3,&init);GPIO_Inilize(GPIO_P1,&init);
}
void UART_Config(){COMx_InitDefine init; init.UART_Mode = UART_8bit_BRTx;init.UART_BRT_Use = BRT_Timer1;init.UART_BaudRate = 115200;init.Morecommunicate = ENABLE;init.UART_RxEnable = ENABLE;init.BaudRateDouble = DISABLE;UART1_SW(UART1_SW_P30_P31);NVIC_UART1_Init(ENABLE,Priority_0);UART_Configuration(UART1,&init);init.UART_BRT_Use = BRT_Timer2;NVIC_UART2_Init(ENABLE,Priority_0);UART_Configuration(UART2,&init);
}

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电路分析 ---- 加法器

1 同相加法器分析过程虚短:\(u_{+}=u_{-}=\cfrac{R_{G}}{R_{G}+R_{F}}u_{O}\) \(i_{1}=\cfrac{u_{I1}-u_{+}}{R_{1}}\);\(i_{2}=\cfrac{u_{I2}-u_{+}}{R_{2}}\);\(i_{3}=\cfrac{u_{I3}-u_{+}}{R_{3}}\);且有\(i_{1}+i_{2}+i_{3}=0\). 所以得到\(\cfrac{u_{I1}}{R_{1}}+\cfr…

docker 配置elasticSearch

1、拉取elasticSearch容器 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.9.0 2、运行容器并且与物理机映射端口(9200,物理机器) 9300(容器端口) docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node&quo…

mini-lsm通关笔记Week1Day7

Summary在上一章中,您已经构建了一个具有get/scan/put支持的存储引擎。在本周末,我们将实现SST存储格式的一些简单但重要的优化。欢迎来到Mini-LSM的第1周零食时间! 在本章中,您将:在SST上实现布隆过滤器,并集成到LSM读路径get中。 以SST块格式实现对key存储的压缩。要将…

记一次我的博客园页面突然无法显示markdown数学公式

记一次我的博客园页面突然无法显示markdown数学公式,之前都还好好的,今天突然给我数学公式卡没了......之前都还好好的,今天突然给我数学公式卡没了......具体情况如下但是我编辑的时候预览明明可以摘要里显示也没有问题给官方写了封邮件后得到回复如下 您好,我们这边测试一…

RRAM流片调试心得

RRAM流片调试心得 去年进行了一次RRAM的流片工作,也是人生第一次流片,一些工作细节不便涉及,但是可以谈谈这次流片以及后续测试中碰到的问题,以便后续查阅。 芯片于UMC完成180nm的CMOS前道工艺,共生长5层金属(到V5),随后出Fab,送到所里生长RRAM和M6完成后道工艺,版图…

C#自定义控件—文本显示、文本设值

C#用户控件之文本显示、设定组件 如何绘制一个便捷的文本显示组件、文本设值组件(TextShow,TextSet)?绘制此控件的目的就是方便一键搞定标签显示(可自定义方法显示文本颜色等),方便自定义方法又省略了挨个拖拽的过程纯定义属性 【文本设定】:字体、标签、值、单位;事件…

搜索组件优化 - Command ⌘K

今天心血来潮想在 `blog` 上找一篇文章,用搜素的功能发现搜不出来😂,搜索挂了?然后突然想起来之前由于想着在 `blog` 中可能加一些私有的配置或者尝鲜的功能,所有 `fork` 了一份变成 私有项目了,这样就不符合 `DocSearch` 的 网站必须是公开的这个限制了。前言: DevNow…

项目协同开发 or 拷贝项目

项目协同开发 or 拷贝项目 给另人项目时一般需要给代码 requiremenets.txtpip freeze > requiremenets.txt #requiremenets.txt 生成方式获得别人代码 pip install -r requiremenets.txt # 自动将:requiremenets.txt 对应的版本进行安装无网络问题-解决安装第三方模块…

深入浅出Stream流

Java 8的新特性之一就是流stream,配合同版本出现的 Lambda ,使得操作集合(Collection)提供了极大的便利。 案例引入 在JAVA中,涉及到对数组、Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。 假设遇到了这么…

决策树之——ID3算法及示例

0 前言本文主要介绍决策树ID3算法,并举出构建示例帮助理解。 读者需要具备的知识:信息熵、条件熵、信息增益。 本文使用数据集为:游玩数据集 1.1节。1 ID3算法简述 ID3(Iterative Dichotomiser 3)算法是一种经典的决策树学习算法,由Ross Quinlan于1986年提出。该算法的主…

AtCoder ABC 369题解

题解前言 本题解部分思路来源于网络,仅供参考 ! A - 369 题目大意 给定 \(A\) , \(B\) 两个整数,求有多少个整数 \(x\) 使得可以通过某种排列使得 \(A\) ,\(B\) ,\(x\) 为等差数列。解题思路 稍加分析即可得到:如果 \(A = B\) 则结果为 \(1\) 。如果 \(A = B\) 但 \((A …

三路快速排序

// 快速排序 function quickSort(arr) {if (arr.length <= 1) {return arr;}const pivot = arr[0];const left = [];const right = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}return quickSort…