嵌入式常用通信协议 #UART

本文介绍了UART的通用异步串行通信机制,包括数据帧结构、波特率概念,以及STM32F1系列中USART接口的详细配置过程。重点讨论了STM32F1的USART框架、寄存器配置和应用实例,如波特率设置、printf重定向和与SPI设备的交互。

一、概述

        Universal Asynchronous Receiver/Transmitter,UART是一种通用、异步串行通信总线,其有两根信号线,可实现全双工的发送和接收,一般用于点对点的、主机对从机间的通信。

         两根信号线分别为发送线(TXD)和接受线(RXD),TXD用于给别人发送数据,RXD用于接收别人发来的数据。

        通常在使用串口时,需要将发送者和接收者的地线(GND)接在一起,这将会使两者的参考电平一致,利于数据发送的稳定。

                  

二、UART的数据帧格式与波特率

        UART的一帧数据有11位(按照配置而有所变化),当数据线(TXD或RXD)的电平产生下降沿时,代表起始位,此时开始通信,按照先发低位后发高位的方式依次发送8位(数据位可配置为5~8位)数据位后,再根据配置发送一位校验位(校验位可配置为奇偶校验或者无校验位),最后再产生一个上升沿作为停止位,便是一帧数据。

        总的来说,UART的数据帧就只包括:起始位、数据位、校验位、停止位。当有数据要传输时,按照这种格式来搭建数据帧,当数据线空闲时,默认为高电平,以便下次发送起始位。

        数据帧格式已经很清楚了,但是试想当这样一种情况发生时会如何处理:

这两种情况在接收方看来都是一样的,都是先高电平后低电平,没法区分是1100还是10又或者是11110000,为解决这种问题,UART引入波特率的概念,波特率的意思是一秒内能发送多少位,比如说当波特率为9600时,发送者和接收者达成协议,都认为数据线上一秒钟能读取9600位的信号,将一秒钟9600等分,便可以精确的计算出每位信号持续的时间,于是判断高电平或低电平持续多少时间,就能够分辨出持续的高电平中到底有几位数据,通过这种最古朴的掐时间方式,上图的问题就解决了。

        常见的波特率取值通常是2的整数次幂,以确保波特率发生器能够从微控制器或计算机系统的主时钟频率进行简单的分频。如9600、115200、1000000等。

        波特率是凭借单片机中的时钟频率来产生的,有时候时钟频率会产生误差,导致一秒内不一定读取了9600次数据位,在串行通信中,一位错,就位位错,这将会导致非常严重的数据错误,但是UART使用起始位和停止位来隔

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值