day9 串口通信

发布于:2025-07-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

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。常用的波特率有9600bps115200bps。 可以根据实际需求进行修改。

举个例子:一般采用的波特率是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;变量配置

  1. USART_BaudRate             指的是波特率              常用9600bps  115200bps
  2. USART_WordLength        指的是数据位           常用8bit   低位先出

  1. USART_StopBits               指的是停止位        常用1bit

  1. USART_Parity           指的是校验位        常用无校验

  1. USART_Mode          指的是串口模式 常用收发模式  USART_Mode_Rx | USART_Mode_Tx

  1. 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,中时钟和锁相环都改过了。

明天可能继续往下写,可能继续找该问题解决方式


网站公告

今日签到

点亮在社区的每一天
去签到