1.基本的概念
通信时钟不同可以将通信方式分为:
(1)异步通信:
是一种无需等待操作完成即可继续执行的通信方式。发送方将消息发送给接收方后,不会立即等待接收方的响应。相反,发送方可以继续执行其他任务,并在需要时检查接收方是否已经作出响应。
(2)同步通信是一种需要等待操作完成后才能继续执行的通信方式。发送方在发送消息后会阻塞,直到接收方完成处理并返回响应。只有在接收到响应后,发送方才能继续执行后续任务。
(3)两者的区别 :
1.同步通信要求接收端时钟频率和发送端时钟频率一致,发送端发送连续的比特流;异步通信时不要求接收端时钟和发送端时钟同步,发送端发送完一个字节后,可经过任意长的时间间隔再发送下一个字节。
2.同步通信效率高;异步通信效率较低。
3.同步通信较复杂,双方时钟的允许误差较小;异步通信简单,双方时钟可允许一定误差。
4.同步通信可用于点对多点;异步通信只适用于点对点。
TX发送,RX接收,使用TTL电平(3.3v表示1,0v表示0)
波特率:串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。
传输的过程:空闲状态保持高电平,给低电平(下降沿)后开始传输数据,并且是从数据的低位开始传输,所以给出数据的二进制码后需要从低位到高位输入电平。
奇偶校验位(这个方法的检出率太低,可以拓展一下CRC校验):可以选择不校验,奇校验,偶校验。不校验就是左图,偶校验就是右图。
(总结:选择x校验,就保证1的个数时x数)
奇校验:数据位有奇数个1时,校验位给0;有偶数个1时,校验位给1。
偶校验:数据位有偶数个1时,校验位给0;有奇数个1时,校验位给1。
2.USART简介
DR寄存器分为TDR(写入寄存器)和RDR(接收寄存器)
USART框图寄存器的工作原理:
(1)写操作时:数据进入TDR,然后进入发送移位寄存器(一旦发送到此,后面的数据就在TDR中等待),移位完成后(后面在TDR中等待的数据立马进入移位寄存器),标志位TXE置1(发送寄存器空)。最后发送器控制发送至TX引脚。
(2)读操作时:.....标志位RXNE置1......
移位寄存器每移位一次SCLK就跳变一个周期
3.利用串口发送数据的步骤:
(1).开启usart的时钟
(2).配置初始结构体:
.USART_BaudRate :波特率
.USART_HardwareFlowControl:选择是否需要硬件流控制
.USART_Mode:选择发送或接收模式
.USART_Parity:选择奇偶校验
.USART_StopBits:选择停止位长度
.USART_WordLength:选择字长
(3).使能USART
void Serial_Init(void) { /*开启时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟 /*GPIO初始化*/ GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA9引脚初始化为复用推挽输出 /*USART初始化*/ USART_InitTypeDef USART_InitStructure; //定义结构体变量 USART_InitStructure.USART_BaudRate = 9600; //波特率 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //硬件流控制,不需要 USART_InitStructure.USART_Mode = USART_Mode_Tx; //模式,选择为发送模式 USART_InitStructure.USART_Parity = USART_Parity_No; //奇偶校验,不需要 USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位,选择1位 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长,选择8位 USART_Init(USART1, &USART_InitStructure); //将结构体变量交给USART_Init,配置USART1 /*USART使能*/ USART_Cmd(USART1, ENABLE); //使能USART1,串口开始运行 }
(4).实现一些串口的小功能:
1.Serial_SendByte(uint8_t Byte)函数:发送一个字节
2.Serial_SendArray(uint8_t *Array, uint16_t Length)函数:发送一个数组
3.Serial_SendString(char *String)函数:发送一个字符串
4.uint32_t Serial_Pow(uint32_t X, uint32_t Y)函数:发送x的y次方
5.Serial_SendNumber(uint32_t Number, uint8_t Length)函数:发送数字
6.输出功能:
①格式化输出->printf()函数:重定向fputc函数,因为printf的底层是调用fputc函数实现的。
②直接输出->Serial_Printf(char *format, ...)函数:sprint()函数,定义字符串,再调用sprint()函数,然后调用Serial_SendString(char *String)函数发送字符串来打印【这里利用了可变参数列表需要注意】
/** * 函