UART通信协议

  • 概念
  • 通信基础
    • 并行通信
    • 串行通信
    • 单工通信
    • 双工通信
      • 半双工
      • 全双工
    • 波特率
  • UART帧格式
  • 硬件连接
  • 控制器
  • AVR单片机USART相关寄存器
    • I/O数据寄存器 UDR
    • 控制和状态寄存器 UCSRA
    • 控制和状态寄存器UCSRB
    • 控制和状态寄存器UCSRC
    • 波特率寄存器UBRRL和UBRRH
  • USART的使用方法
    • 初始化
    • 发送函数
    • 接受函数
    • 主函数
  • 实例

概念

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。

通信基础

并行通信

串行通信

单工通信

数据传输方向是单向。

双工通信

半双工

通信不可同时进行

全双工

波特率

波特率是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如传输使用256阶符号,每8bit代表一个符号,资料传送速率为120字符/秒,则波特率就是120baud,比特率是120*8=960bit/s。

UART帧格式

硬件连接

控制器

一般情况下处理器都会集成UART控制器,我们使用YART进行通信时只需要对其内部相关控制器进行设置即可。

AVR单片机USART相关寄存器

I/O数据寄存器 UDR

控制和状态寄存器 UCSRA

  • 位7—RXC:USART接收结束(中断标志位)
  • 位6—TXC:USART发送结束
  • 位5—UDRE:数据寄存器空
  • 位4—FE:帧错误
  • 位3—DOR:数据溢出
  • 位2—PE:奇偶校验错误
  • 位1—U2X:倍速发送
  • 位0—MPCM:多处理器通信模式

控制和状态寄存器UCSRB

  • 位7—RXCIE:接受结束中断使能,为1产生中断
  • 位6—TXCIE:发送结束中断使能
  • 位5—UDRIE:USART数据寄存器空 中断使能
  • 位4—RXEN:接受使能,置为后将启动USART接收器
  • 位3—TXEN:发送使能,置为后将启动USART发送器
  • 位2—UCSZ2:字符长度
  • 位1—RXB8:对于9位串行帧进行操作时,RXB8是第9个数据位。
  • 位0—TXB8:对于9位串行帧进行操作时,TXB8是第9个数据位。

控制和状态寄存器UCSRC

  • 位7—URSEL:寄存器选择,通过该位访问UCSRC寄存器或UBRRH寄存器。当读UCSRC时,该位为1;当写UCSRC时,该位必须写1
  • 位6—UMSEL:USART模式选择,通过这一位来选择同步或异步工作模式,0为异步,1为同步
  • 位5—位4 UPM:奇偶校验模式设置,00禁止,01保留,10偶校验,11奇校验
  • 位3—USBS:停止位选择。0-停止位位数1;1-停止位位数2
  • 位2—位1 UCSZ:字符长度设置
  • 位0—UCPOL:时钟极性,仅用于同步工作模式

波特率寄存器UBRRL和UBRRH

  • 位15—URSEL:寄存器选择,当读时为0,当写时为1
  • 位11—0 UBRR比特率寄存器:UBRRH包含了比特率的高四位,UBRRL包含了低8位

在操作时设置最高位URSEL来区分。

  • 写操作:当写入数据时,最高位为0,数据写入UBRRH;数据的最高位为1时,数据写入UCSRC 读操作
  • 读操作:第一次读取的值为寄存器UBBRH的数值,如果在连续的两个时钟周期里都执行读操作,那么第二次读到的就是UCSEC的值

波特率计算公式

例子


误差计算公式

USART的使用方法

  1. 初始化。工作模式,帧结构等(UCSRC)
  2. 波特率设置(UBBRL,UBBRH)
  3. 中断的相关设置(UCSRB)
  4. 选择中断号,编写中断服务函数

初始化

//以atmega32为例#define uchar unsigned char
#define uint unsigned int
#define fosc 7372800 //时钟频率uchar rdata;
uchar flag;void uart_init(uint baud)//baud为设置的比特率
{uint a;
UCSRC=0x86;
a=fosc/16-baud-1;
UBRRL=a%256;
UBRRH=a/256;
UCSRB=0x98;
SREG|=BIT(7);
}

发送函数

void uart_send(uchar data)
{while(!(UCSRA&BIT(UDRE))); //第五位是否为1,从而满足条件退出循环发送数据
UDR=data;
while(!(UCSRA&BIT(TXC));
UCSRA|=BIT(TXC); //写1进行清除操作
}

接受函数

#pragma interrupt_handler uartrece_isr:12 //中断号
void uartrece_isr(void)
{UCSRB&=~BIT(7); //第七位清零
rdata=UDR;
flag=1;
UCSRB|=BIT(7); //打开中断
}

主函数

void main(void)
{uchar i ='h';
uart_init(9600);
//uart_send(i);
while(1){if(flag){flag=0;uart_send(rdata); }}
}

实例

// ATMEGA32
#define F_CPU 8000000UL
#define myUBRR 8 // 115200 b/s
#define myU2X 1
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>void USART_Init( unsigned int speed)//使用 UBRR 寄存器的给定值初始化 USART,该值应根据波特率 BoudRate 计算
/*  当 U2X=0 UBRR=Fosc/(16*BaudRate)-1  BaudRate=Fosc/16(UBRR+1) 当 U2X=1UBRR=Fosc/(8*BaudRate)-1 BaudRate=Fosc/8(UBRR+1)
*/
{UBRRH = (unsigned char)(speed>>8);UBRRL = (unsigned char)speed;UCSRB=(1<<RXEN)|( 1<<TXEN); //允许接收和发送USART#if (myU2X==1) //只有当myU2X=1时才会编译以下行UCSRA |= (1<<U2X); //传输速率加倍#endifUCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);// 8位传输,1个停止位}void USART_Transmit( unsigned char data ) //向USART通道传输一个字节
{while ( !(UCSRA & (1<<UDRE)) ); //检查数据寄存器的释放(准备加载下一个字节)UDR = data; //将数据加载到寄存器中进行传输UCSRA |= (1<<TXC); // 重置传输完成位
}int main (void)
{char ch='O';int i;DDRC=0xFF;USART_Init(myUBRR);while (true) {i=0;do {PORTC=i;// 将循环数输出到端口 C,准备在日志文件中固定新接收到的符号if (UCSRA & (1<<RXC)){ // 控制从 USART 通道接收信息ch=UDR;// 读取接收缓冲区以准备接收下一个字节if (UCSRA & ((1<<FE)|(1<<DOR))){ //检查是否有接收错误ch='.';//接收到的有错误的字节被替换为'.'PORTC=0xFF;//便于识别日志文件中的情况}// 没有接收错误PORTC=ch;//将接收到的字节输出到端口C,以便在日志文件中修复USART_Transmit(ch);i++;}}while (i<10);while ( !(UCSRA & (1<<TXC)) ); //检查空闲移位寄存器(传输完成)
//关闭并打开UART,
//导致需要新的接收同步(搜索起始位)UCSRB &= ~((1<<RXEN)|( 1<<TXEN));//禁用UART发送/接收,这会重置缓冲区中累积的接收位。PORTC=0; // 在日志文件中记录 UART 被禁用的那一刻for (i=0;i<(3*myUBRR);i++);//持续时间等于几位传输时间的时间延迟UCSRB|=((1<<RXEN)|( 1<<TXEN));// 启用 UART 发送/接收,开始搜索起始位PORTC=1;// 在启用 UART 的那一刻记录在日志文件中}
}

UART嵌入式通信协议(以AVR单片机为例)相关推荐

  1. AVR单片机C语言入门一例

    [ 前言 ]AVR单片机C语言编译软件有IAR.ICCAVR.winavr.Atmanavr.CodeVisionAVR等.其中CodeVisionAVR又称 CVAVR,它可以说是目前最容易入门的C ...

  2. ds18b20温度传感器 lcd C语言,基于AVR单片机的18B20温度传感器及LCD显示的C语言程序设计...

    ***************************************************/ #include #include #define uchar unsigned char # ...

  3. stm32串口接收不定长数据_基于STM32之UART串口通信协议--接收

    一.前言 1.简介 回顾上一篇UART发送当中,已经讲解了如何实现UART的发送操作了,接下来这一篇将会继续讲解如何实现UART的接收操作. 2.UART简介 嵌入式开发中,UART串口通信协议是我们 ...

  4. AVR单片机网址推荐

    1.  EG3 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料.包括开发公司,技术文档,免费资源等等.版面包括busses & boards,embedded software,dsp, ...

  5. AVR单片机网址推荐 .

    1.  EG3 关于嵌入式开发的站点,提供非常多关于嵌入式开发的资料.包括开发公司,技术文档,免费资源等等.版面包括busses & boards,embedded software,dsp, ...

  6. AVR单片机特性简介

    AVR单片机是ATMEL公司在1997年研发的增强型内置Flash的RISC精简指令集高速单片机.可以广泛应用于计算机外部设备.工业实时控制.仪器仪表.通讯设备.家用电器等各个领域. 一. AVR单片 ...

  7. 基于USBASP给AVR单片机烧写Arduino bootloader和application固件

    基于USBASP给AVR单片机烧写Arduino bootloader和application固件 Arduino 微控制器的数字端口和模拟端口与 ATMEGA 328 芯片引脚的对应关系图如下.其中 ...

  8. avr-gcc与avr单片机c语言开发 pdf,AVR 单片机与GCC 编程使用方法

    原标题:AVR 单片机与GCC 编程使用方法 WIN 是一个ATMEL AVR 系列 的开发工具集,它包含GNU C 和C++编译器 . 1.1 一个简单的例子 为了先有一个感性的认识,我们首先看一下 ...

  9. 关于AVR单片机熔丝位的设置和拯救方法大全 AVR单片机熔丝位的设置和详细的拯救方法...

    熔丝位是ATMEL公司AVR单片机比较独到的特征.在每一种型号的AVR单片机内部都有一些特定含义的熔丝位,其特性表现为多次擦写的E²PROM.用户通过配置(编程)这些熔丝位,可以固定地设置AVR的一些 ...

  10. [转载]轻松玩转LCD12864-基于AVR单片机的LCD12864串行显示

    原文链接: http://bbs.elecfans.com/forum.php?mod=viewthread&tid=282698&extra=&highlight=12864 ...

最新文章

  1. 【1863】畅通工程 (HDU)
  2. ping 不通容器 宿主_Docker容器间通信
  3. android 锁屏解决方案,Android 实现锁屏的较完美方案
  4. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取
  5. arm opcode hook
  6. Java——集合的基本功能测试
  7. 关于CString的=操作符
  8. Rust: codewars 的Duplicate Encoder
  9. Valine-1.4.4新版本尝鲜+个性制定(表情包、qq头像、UI样式)
  10. 区块链交易正规平台有哪些?哪个区块链交易平台正规?
  11. VSCode,webstorm绿色护眼背景设置
  12. 《计算之魂》1.11.2--阅读心得
  13. 同期及上期数据对比显示
  14. MATLAB环境下基于振动信号的轴承状态监测和故障诊断
  15. IComponent2 Interface 学习
  16. 山东标梵网站制作项目启动流程详解
  17. 计算标准差、方差的Python程序
  18. android+祖玛游戏源码,unity祖玛游戏Zuma Ball Blast源码
  19. HDLC广域网协议设置
  20. 关于压缩工具7-zip的7z脚本用法

热门文章

  1. 日常办公,无特殊要求者怎么选择显示器?
  2. Navicat自动运行批处理作业并发送附件邮件
  3. 中国网站广告联盟大集合
  4. ORacle异常:ORA-00980:同义词转换不再有效
  5. docker容器2:镜像制作
  6. 《酒干倘卖无》歌曲什么意思,看了《搭错车》感人电影就知道了
  7. android视频录制旋转,android – 录制的视频在上传到互联网后旋转90度
  8. matlab表格数据合并同类项,Excel合并同一列中的同类项原来这么简单,赶紧收藏!...
  9. bzoj-4565-区间dp+状压
  10. 【基于物理的渲染(PBR)白皮书】(四)法线分布函数相关总结