Bootstrap

单片机开发中的通信协议——串口通信(UART)篇(3)

前言
串口通信(UART)是单片机开发中最常用的通信协议之一,广泛应用于单片机与传感器、上位机(如PC)以及其他设备之间的数据交互。掌握串口通信的原理和实现方法,对于嵌入式系统开发至关重要。
一、串口通信(UART)的基本原理
1.1 UART通信简介
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种串行通信协议,用于设备之间的异步数据传输。其主要特点包括:
异步通信:发送和接收端使用独立的时钟,通过起始位和停止位同步数据。
简单的电气接口:通常使用两根线(RX和TX)进行数据传输。
可配置的波特率:通信速率(波特率)可以根据需要配置,常见的波特率有9600、115200等。
1.2 UART数据格式
UART通信的数据格式通常包括以下几个部分:
起始位:一个低电平信号,用于标识数据传输的开始。
数据位:通常为8位,表示要传输的实际数据。
校验位(可选):用于数据校验,可以是奇校验、偶校验或无校验。
停止位:一个或两个高电平信号,用于标识数据传输的结束。
1.3 UART通信的应用场景
单片机与PC通信:通过串口模块(如CH340、CP2102)实现数据交互。
单片机与传感器通信:部分传感器(如温湿度传感器)支持串口通信。
设备间通信:多个单片机之间可以通过串口进行数据交互。
二、STM32平台上的UART实现
2.1 STM32的USART模块
STM32系列单片机提供了多个USART(通用同步/异步收发器)模块,用于实现UART通信。这些模块支持多种配置,包括波特率、数据位、停止位和校验位等。
2.2 USART模块的初始化
以下是基于STM32的UART初始化代码示例,使用标准库函数进行配置:

#include "stm32f10x.h"

void USART1_Init(uint32_t baudrate) {
    // 1. 使能USART1时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // 2. 配置USART1参数
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = baudrate;  // 波特率
    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_Rx | USART_Mode_Tx;  // 模式:接收和发送
    USART_Init(USART1, &USART_InitStructure);

    // 3. 使能USART1
    USART_Cmd(USART1, ENABLE);
}

2.3 数据发送与接收
以下是发送和接收数据的代码示例:

// 发送单个字节
void USART1_SendByte(uint8_t data) {
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  // 等待发送缓冲区为空
    USART_SendData(USART1, data);  // 发送数据
}

// 接收单个字节
uint8_t USART1_ReceiveByte() {
    while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);  // 等待接收缓冲区非空
    return USART_ReceiveData(USART1);  // 读取数据
}

2.4 主函数示例
以下是一个简单的主函数示例,实现LED闪烁并通过串口发送数据:

int main(void) {
    // 初始化USART1,波特率为115200
    USART1_Init(115200);

    while (1) {
        USART1_SendByte('H');  // 发送字符'H'
        for (volatile int i = 0; i < 500000; i++);  // 延时
    }
}

三、串口通信的调试技巧
3.1 串口调试助手
串口调试助手是测试UART通信的常用工具,可以帮助你发送和接收数据。常见的串口调试助手包括PuTTY、SecureCRT和STC串口助手。
使用方法:
(1)配置波特率、数据位、停止位和校验位,确保与单片机一致。
(2)连接串口模块(如CH340)到PC,并将单片机的TX和RX引脚连接到模块。
(3)发送数据并观察单片机的响应。
3.2 逻辑分析仪
逻辑分析仪可以捕获串口通信的信号波形,帮助你分析时序问题。通过逻辑分析仪,你可以观察到起始位、数据位和停止位的波形。
使用方法:
(1)将逻辑分析仪的通道连接到单片机的TX和RX引脚。
(2)设置采样率和触发条件。
(3)捕获数据并分析波形。
3.3 常见问题排查
(1)波特率不匹配:确保单片机和上位机的波特率一致。
(2)硬件连接问题:检查TX和RX引脚是否连接正确。
(3)电源问题:确保串口模块和单片机的电源正常。
(4)数据错误:检查数据格式(如校验位)是否正确。

四、总结
本文详细介绍了串口通信(UART)的基本原理、STM32平台上的实现方法和调试技巧。通过学习这些内容,你可以实现单片机与上位机或其他设备的通信。如果你掌握了,你可以尝试增加难度 比如 串口的中断处理、DMA配合串口的空闲中断、以及串口发送和接收数据的缓冲buffer设计,另外扩展到RS485通讯中去。多多练习和尝试。

;