STM32 UART通信协议 基础知识

        通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议。

        在通信领域中,有两种数据通信方式:并行通信串行通信。串口的数据传输是以串行方式进行的。串口在数据通信中,一次只能传输一个比特的数据。串行数据的传输速度用bps或波特率来描述每秒的二进制位数,单位为bps(bit per second)也称为波特率。

        同步通信和异步通信是指在通信过程中数据传输的方式。

        同步通信是指发送方和接收方在传输数据时需要同步进行,也就是说,发送方必须等待接收方确认后才能继续发送数据,而接收方必须等待数据到达后才能继续处理。这种通信方式可以保证数据的准确性和可靠性,但是会降低通信效率。

A———数据总线————B

A————CLK—————B

A————\bar{cs}——————B

        cs上面加一个横线代表 低电平有效。

        当A给B传输的时候,A把 \bar{cs} 电平拉低,B看到电平被拉低了,就知道A要给B传数据了。此时A就会在数据总线把数据发送出来,但是B如何判断A发送的这么多信息中哪些是数据呢?A用CLK信号线中告诉他,B只需要在CLK中的上升沿取值就可以了,在上升沿取到的值就是需要的数据。简而言之,就是收发双方有一个同步信号线,把他们同步在一起。

        USART中的S就是同步通信但是用的很少,常常直接成为UART。

        异步通信是指发送方和接收方可以独立地进行数据传输,不需要等待对方的确认或回应。发送方可以继续发送数据,而接收方可以在数据到达后再进行处理。这种通信方式可以提高通信效率,但是由于没有同步的保证,数据的准确性和可靠性可能会受到影响。

        在异步通信中没有cs也没有CLK,只有一个数据总线。

A.RX—————B.TX

A.TX—————B.RX

A———GND———B

TX:发送,RX:接收,GND:接地。

STM32 UART通信协议 基础知识_第1张图片

空闲状态:高电平

起始位:1位的起始位,从空闲状态转换为起始位是靠一个下降沿产生的。

数据位:5~8位的数据位连同校验位

奇偶校验:数据位连同校验位中,“1”的数目等于奇数,则为奇校验;

我们常用8n1,意思是有8位数据位,没有效验码,1位停止位。

        当起始位突然从高电平变到了低电平时,B就是知道A要开始传输了,拉低电平的1个bit后,A就开始发送数据,发送完数据位后,双方规定一下有没有奇偶校验,有的话是奇校验还是偶校验,判断数据有没有错误,然后发送停止位,抬高电平,返回空闲状态。

        这个数据一般用5~8位的数据位,更多的时候用8个bit的数据位,因为c语言中的char正好是8位。并且双方要约定好,传输8位就是8位,不能改变。

        在实际应用中,通常会根据具体情况选择同步通信或异步通信。例如,对于实时性要求较高的应用,可能会选择同步通信,而对于数据量较大或实时性要求不高的应用,可能会选择异步通信。

        全双工是指通信双方可以同时发送和接收数据的一种通信方式。在全双工通信中,通信双方可以同时发送和接收数据,而不会出现发送和接收数据冲突的问题。这种通信方式可以实现更高效的数据传输和更顺畅的通信。常见的全双工通信方式有电话通信、视频会议等。

 bsp_uart.c

#include "bsp_uart.h"

void Uart1_Configuration(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   //TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   //TX
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitStructure.USART_BaudRate = 115200;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	USART_Init(USART1, &USART_InitStructure);
	USART_Cmd(USART1, ENABLE);
}

 bsp_uart.h

#ifndef __BSP_UART_H__
#define __BSP_UART_H__

#include 

void Uart1_Configuration(void);

#endif

     

你可能感兴趣的:(stm32,嵌入式硬件,单片机,学习,c++,c语言)