1串口通信
串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式,核心是通过 TX(发送) 和 R(接收) 两根线实现全双工数据传输。
2通信协议分类
2.1同步/异步通信
同步和异步是串行通信中两种根本不同的数据传输方式,核心区别在于 是否需要共享时钟信号 来协调数据传输。
2.1.1同步通信
同步通信:带时钟同步信号,如IIC接口或者SPI接口都属于同步通信,要求通信双方必须使用同一个时钟,相当于发送数据的同时接收数据,同步通信属于连续串行传输数据,一次只传输一帧数据,相比于异步通信而言,传输效率更高,缺点是时钟必须一致
2.1.2异步通信
异步通信:不带时钟同步信号,如UART接口属于异步通信,要求通信双方具有发送端和接收端,由于不要求时钟同步,所以在通信的时候,通信双方必须提前约定好通信格式(字符格式)以及通信速率,异步通信以字符为单位进行传输,在传输一个字符的时候会添加起始位和停止位,通过起始位以及停止位来达到同步的功能。
2.1.3关键对比
对比项 | 同步通信 | 异步通信 |
时钟信号 | 必需(SCL、SCLK) | 无需 |
数据帧格式 | 无起始/停止位,连续传输 | 每帧含起始/停止位 |
速度 | 高(SPI可达100Mbps) | 低(通常<1Mbps) |
距离 | 短(通常<1m) | 长(RS485可达1200m) |
复杂度 | 高(需时钟同步) | 低(仅需波特率一致) |
典型协议 | SPI、I2C | UART、RS232、RS485 |
2.2串行/并行通信
2.2.1串行通信
传输原理:数据按位依次顺序传输,如发送字节0x41(ASCII 'A')的二进制01000001,从LSB或MSB开始逐个传输。
优点:节约引脚资源(最少一根线)、传输成本低、传输距离远
缺点:传输速度慢
应用领域:一般用于工控设备、测量设备、少部分通信设备 USB COM口
2.2.2并行通信
传输原理:多位数据同时通过多根数据线发送。例如,8位数据0x41通过8根线同时传输,每根线对应1位。
优点:传输速度快
缺点:占用引脚资源、传输成本高、传输距离近、抗干扰能力弱(串扰)
应用领域:一般大量数据传输,并且传输距离较近 如计算机总线
2.3单工/半双工/全双工通信
2.3.1单工/半双工/全双工概念对比
模式 | 数据传输方向 | 典型协议/硬件 | 优缺点 |
单工 | 单向固定(A→B) | 广播、遥控器、FM收音机 | 简单;无法反向传输 |
半双工 | 双向交替(A→B或B→A,不同时) | RS485、对讲机、I2C | 节省线路;需切换方向,效率较低 |
全双工 | 双向同时(A→B和B→A可同时进行) | UART、SPI、电话、USB | 高效;需独立通道,成本略高 |
2.3.2单工/半双工/全双工对比
维度 | 单工 | 半双工 | 全双工 |
效率 | 最低 | 中等(需切换方向) | 最高(双向同时) |
成本 | 最低(单线) | 中等(共享线路) | 较高(独立通道) |
典型场景 | 广播、遥控 | 工业总线、对讲机 | 电话、USB、高速数据传输 |
协议举例 | FM广播 | RS485、I2C | UART、SPI、以太网 |
3通信接口
通信双方可以实现按照某一种协议进行通信的前提是:首先双方都有一个相同的通信接口。该接口还要可以按照通信协议进行数据的收发。
口协议只规定了按照怎样的顺序传输,但是数字量如何转换,
按照什么电平标准到另一个器件,这个不是协议所规定的
RS232,RS485电平是串口通信过程中的一种电平标准,不是协议
例如:
硬件设备和计算机在通信的时候,需要用到电气转换芯片(如MAX232),因为硬件平台一般采用TTL电平信号(采用正逻辑电平,+5V等价于逻辑1,0V等价于逻辑0),但是计算机采用RS232电平信号(采用负逻辑电平,-15V~-3V 表示逻辑1,+3V~+15V 表示逻辑0)。
通信时一般数据都是以二进制进行收发,那么电压信号在什么情况下为逻辑“1”,在什么情况下为逻辑“0”,这时就需要按照相同的电平规范来接收。
TTL电平规范
COMS
RS485电平规范
4串口通信的参数
USART或者UART都是全双工异步通信,由于不需要时钟同步,所以就必须要求通信双方要约定字符格式和通信速率。
4.1字符格式
字符格式一般都是采用字符帧的形式进行传输,字符帧由起始位、数据位、校验位、停止位组成。具体的说明可以参考STM32中文参考手册的26.3.1章节。
UART通信的数据帧格式:1位起始位(‘0’),5~8位数据位,1位校验位,0.5、1、1.5、2位停止位
起始位:告知接收方数据开始发送。
数据位:保存传输的数据
校验位:分为奇校验、偶校验和无校验,若选择奇校验,则数据位和校验位上1的总个数为奇数,若选择偶校验,1的个数为偶数。
(1) 起始位:指的是一帧数据的开始 规定为1bit的低电平
(2) 数据位:指的是有效的信息,可以为7bit(标准ASCII码)或者8bit(拓展ASCII码)
(3) 校验位:指的是对于数据位的简单校验,可以确保数据正常发送,也可以避免噪声的影响,校验分为奇校验、偶校验,校验位也只占1bit。一般不使用校验位。
(4) 停止位:指的是一帧数据传输完成 停止位一般选择1bit,规定为高电平
4.2通信速率
通信速率指的是单位时间内传输的有效的二进制数的个数,也被称为波特率,单位为bps。常用的波特率有9600bps、115200bps。 可以根据实际需求进行修改。
举个例子:一般采用的波特率是9600bps,字符格式选择8bit数据位、无校验、1bit停止位,然后再加上1bit的起始位,所以一帧字符占10bit,所以单位时间可以传输960帧。
5代码配置
5.1配置步骤
stm32f4xx_tim.c函数中可以查看
===============================================================================
##### How to use this driver #####
===============================================================================
[..]
(#) Enable peripheral clock using the following functions
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USARTx, ENABLE) for USART1 and USART6
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USARTx, ENABLE) for USART2, USART3, UART4 or UART5.
1.使能USART
(#) According to the USART mode, enable the GPIO clocks using
RCC_AHB1PeriphClockCmd() function. (The I/O can be TX, RX, CTS,
or/and SCLK).
2.使能GPIO
(#) Peripheral's alternate function:
(++) Connect the pin to the desired peripherals' Alternate
Function (AF) using GPIO_PinAFConfig() function
3.使用GPIO_PinAFConfig()将引脚复用
(++) Configure the desired pin in alternate function by:
4通过以下方式将引脚配置为复用功能
GPIO_InitStruct->GPIO_Mode = GPIO_Mode_AF
(++) Select the type, pull-up/pull-down and output speed via
GPIO_PuPd, GPIO_OType and GPIO_Speed members
(++) Call GPIO_Init() function
(#) Program the Baud Rate, Word Length , Stop Bit, Parity, Hardware
flow control and Mode(Receiver/Transmitter) using the USART_Init()
function.
5对串口参数进行配置USART_Init()
(#) For synchronous mode, enable the clock and program the polarity,
phase and last bit using the USART_ClockInit() function.
对于同步模式,这个不用
(#) Enable the NVIC and the corresponding interrupt using the function
USART_ITConfig() if you need to use interrupt mode.
6打开串口中断,配置NVIC
(#) When using the DMA mode
(++) Configure the DMA using DMA_Init() function
(++) Active the needed channel Request using USART_DMACmd() function
DMA的,这个不用
(#) Enable the USART using the USART_Cmd() function.
7打开串口USART_Cmd()
8编写中断服务函数
(#) Enable the DMA using the DMA_Cmd() function, when using DMA mode.
-@- Refer to Multi-Processor, LIN, half-duplex, Smartcard, IrDA sub-sections
for more details
5.2代码整体
实现电脑对单片机数据发送,并显示。使用单片机USART1串口中断方式
mian.c函数
usart.c
5.3出现问题
数据接收区一直是问号
通过打开示例工程,将代码复制进去可以用,知道配置没有错,最后找到问题出在HSE时钟上,单片机实际使用时钟为8MHZ,但是stm32f4xx.h文件中是25MHZ时钟需要修改。
5.4代码解析
5.4.1结构体USART_InitTypeDef USART_InitStructure;变量配置
- USART_BaudRate 指的是波特率 常用9600bps 115200bps
- USART_WordLength 指的是数据位 常用8bit 低位先出
- USART_StopBits 指的是停止位 常用1bit
- USART_Parity 指的是校验位 常用无校验
- USART_Mode 指的是串口模式 常用收发模式 USART_Mode_Rx | USART_Mode_Tx
- USART_HardwareFlowControl 指的是硬件流控制 常用无
5.4.2指定USART中断源,收到数据就发生中断
编写中断服务函数,一般需要提前设置好串口中断的触发条件,一般触发条件都会设置为接收到数据就发生中断。
ST公司提供了一个函数可以设置串口中断源,调用USART_ITConfig()函数
一般在中断服务函数中需要检测中断是否发生(检测中断状态)以及清除中断状态即可。
5.4.3中断服务函数
发送数据
接收数据(需要在中断服务函数中调用该函数来接收数据)
读取状态
状态寄存器
USART_GetFlagStatus(USART1,USART_FLAG_TXE) ;//检测发送寄存器发完,为空
USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
6蓝牙模块使用
6.1引脚连接
VCC---5V
Trig---触发信号输入(模块输入单片机发来的信号)----随便找个引脚配置输出模式
Echo---回想信号输出(模块输出单片机输入)---随便找个引脚配置输入模式
GND---GND
6.2超声波原理
Trig连接的单片机引脚配置输出模式,输出一个至少10us的触发信号;第二部模块来做,完成后通过IO口输出一个高电平信号给单片机;高电平信号由与测试距离成正比,通过定时器记录输入高电平持续时间,根据公式得出距离。
为了超声波测距更加准确可以采用温度补偿
6.3超声波距离计算
通过检测到的高电平持续的时间,计算实际距离
已知测距精度是3mm,声速按照340米每秒算
得到3mm,用时9us,只需在每9us计数一次,知道有多少个9us,便知有多少个3mm。得到的往返距离再除以2,得到实际距离。
6.4代码展示
main.c
.main.h
gpio.c
gpio.h
6.5遇到问题
说实话并没有实现,将代码复制到示例工程中实现了。但是我工程没实现,没有串口发送数据。
且stm32f4xx.h和system_stm32f4xx.c,中时钟和锁相环都改过了。
明天可能继续往下写,可能继续找该问题解决方式