全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 接口/总线/驱动 >

单片机常用通信协议之UART通信简介

时间:2023-07-31 17:10

人气:

作者:admin

标签: 常用  通信    协议  单片机 

导读:单片机常用通信协议之UART通信简介-UART即通用异步收发器(UniversalAsynchronousReceiver/Transmitter),和IIC一样,其总线构成只有两根线,即TX和RX,但其可以同步收发,故UART为异步、全双工的串...

UART通信简介

UART即通用异步收发器(UniversalAsynchronousReceiver/Transmitter),和IIC一样,其总线构成只有两根线,即TX和RX,但其可以同步收发,故UART为异步、全双工的串行通信方式;其在嵌入式单片机领域具有极其广泛的应用,如通常的串口通信:RS232RS485RS422、TTL等。

UART通信允许两个时钟不同的设备进行通信,其原理就是通过双方约定相同的波特率(即单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量)和数据帧格式(即数据位数,校验方式,停止位等)进行数据的收发,波特率的单位是每秒比特数(bps),常用的波特率有:1200bps,2400bps,4800bps,9600bps,19200bps,38400bps,57600bps,115200bps,921600bps等。

UART通信的实现需要两根通信线:TX和RX,其中TX用于数据的发送,RX用于数据的接收,其中主机的TX接设备的RX,主机的RX接设备的TX。

UART通信协议

要实现双方通信则先要定义双方的通信的波特率,然后再进行数据的收发;下面来介绍一下UART通信中的数据帧是怎样的:

  1. 起始位:标志数据传输开始,发出一个逻辑电平为0的信号标志为起始位;
  2. bit数据位:即实际通信中数据bit位数,常用的数据位一般配为5或6或7或8,LSB低位先行;
  3. 奇偶校验位:发送数据的校验可以为无校验、奇校验、偶校验;奇校验:数据位中1的个数为偶数,则校验位为1,否则为0;偶校验:数据位中1的个数为偶数,则校验位为0,否则为1;
  4. 停止位:标志当前数据传输的结束,可配为1位、1.5位或2位的逻辑电平1.
  5. 空闲位:处于逻辑电平1状态。
    一帧完整的数据是由1位起始位、5到8位数据位、0到1位校验位、1/1.5/2位停止位构成,如下图数据帧的传输时序示例所示:

图片

UART通信特点

  1. 不需要同步时钟线,只需要约定好波特率及数据帧格式即可通过TX、RX收发数据,因此其线路相对比较简单,且成本低;
  2. 可实现双向异步通信;
  3. 双方可根据具体的需要来约定具体的传输数据包格式,便于用户进行开发;
  4. 因其高低电平用0和1表示,通信的抗干扰能力差,数据的通信容易受线缆的影响,通信距离偏短。

UART相关代码

UART在我们开发中最常用到的功能就是串口调试功能,以下附上软件UART串口的相关代码供大家参考:

void uart_init(void)//uart初始化

{

UART_InitTypeDef UART_InitStructure;

GPIO_PinRemapConfig(GPIOA, GPIO_Pin_0 | GPIO_Pin_1, GPIO_Remap_0);

UART_InitStructure.UART_BaudRate = 115200;



UART_InitStructure.UART_WordLength = UART_WordLength_8b;

UART_InitStructure.UART_StopBits = UART_StopBits_1;

UART_InitStructure.UART_Parity = UART_Parity_No;

    

UART_Init(UART0, &UART_InitStructure);

}

以上初始化主要为配置相应IO口复用为UART模式(TX脚配为复用推挽输出,RX脚配为浮空输入),配置串口波特率为115200、数据位为8位、1位停止位、无校验位。

//重定位C库函数printf到UART0, 发送一字节数据到UART

int fputc(int c,FILE*f)

{

while(!UART_IsTXEmpty(UART0));

UART_SendData(UART0, (uint8_t) ch);



return ch;

}

//重定位C库函数scanf到UART0,等待串口输入数据

int fgetc(FILE *f)

{

while(UART_GetFlagStatus(UART0,UART_FLAG_RXNE) == RESET);

return(int)UART_ReceiveData(USART0);

}

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信