1.通信接口
在开始通信之前,我们要了解什么是通信,通信就是将一个设备的数据传送到另一个设备。
同时按照双方规定的协议即通信协议,指定通信规则通信双方按照规则进行数据的收发。
应用场景:单片机的串口可以使单片机与单片机、(单片机与电脑)、单片机与各式各样的模块互相通信。底下为单片机串口转USB接口,USB端口连接电脑,串口连接STM32.
2.USART通信电路模型
TX为发送数据,RX为接受数据。UART属于全双工可以同时进行收发数据,同时又属于异步,因为它们没有时钟线,通信双方约定好速率发送接受。
3.串口参数及时序
波特率:串口通信的速度。
起始位:数据帧的开始,固定为低电平。
数据位:有效的数据载荷,1为高电平,0为低电平,低位先行。
校验位:用于数据验证,根据数据位计算得来。常见的有奇校验,偶校验,无校验。
停止位:数据停止,固定为高电平。
如下图所示左边:起始位-数据位-停止位
如下图所示右边:起始位-数据位-校验位-停止位
4.USART简介
USART为同步收发器,UART为异步收发器。要了解的是USART是STM32内部集成的一个硬件外设,可根据数据寄存器的一个字节自动生成数据帧时序,从TX引脚发送出去,同时自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里。
自带波特率发生器,最高达4.5Mbits/s 可配置数据位长度(8/9)、停止位长度(0.5/1/1.5/2) 可选校验位(无校验/奇校验/偶校验)
支持同步模式、硬件流控制(控制数据帧速度)、DMA(数据搬运)、智能卡、IrDA、LIN
STM32F103C8T6 USART资源: USART1(APB2)、 USART2(APB1)、 USART3(APB1).
下图为STM32中UART内部框图:主要的几个模块为发送数据寄存器TDR,发送移位寄存器,接受数据寄存器,接受移位寄存器,TX端口,RX端口,发送控制器,接受控制器,波特率发生器。
5.USART基本结构
USART代码配置流程:
(1)开启时钟,把需要的USART和GPIO时钟打开。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
(2)GPIO初始化,把TX端口配置成复用推挽输出(USART为STM32外设),RX配置为输入。
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//引脚9为TX发送端
GPIO_Init(GPIOB, &GPIO_InitStructure);
(3)配置USART直接使用一个结构体。
//USART配置9600波特率 8位字长 1位停止位 无校验位 无硬件流控制 只有发送模式
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 ;//停止位占一位
USART_InitStructure.USART_WordLength=USART_WordLength_8b ;//发送字长为8bit
USART_Init(USART1,&USART_InitStructure);
(4)开启USART
USART_Cmd(USART1,ENABLE);
6.波特率发生器
发送器和接收器的波特率由波特率寄存器BRR里的DIV确定
计算公式:波特率 = fPCLK2/1 / (16 * DIV)
7.发送数据帧
发送数据帧包含:起始位-数据位-校验位(可省略)-停止位
8.发送HEX数据包
HEX数据包(将多个数据打包)
数据包的任务:将属于同一批的数据进行打包和分割,方便接收方识别。
避免载荷数据与包头包尾重复的方法:(1)限幅:限制载荷数据的长度。(2)增加包头包尾的长度。
可变包长意味着载荷数据长度不一。
如下图所示:HEX数据包以0xFF开头,0xFE结尾。
9.发送文本数据包
文本数据意味着对发送的原始数据进行了编码译码
可变包长意味着载荷数据长度不一。
如下图所示:数据包以@开头,'\r' '\n'结尾。
10.HEX数据包接受
对于串口接收数据来说可以使用查询和中断两种方式。
在本次实验中使用查询的方式:在主函数中不断判断RXNE标志位,置1表明接收到了数据,再调用ReceiveData,读取DR寄存器。
HEX数据包接收用到了状态机思路:(1)根据项目要求定义状态画几个圈(2)考虑好各个状态在什么情况下转移,如何转移画好线和转移条件(3)最后根据图来编程。