1. 嵌入式通信协议概述
在嵌入式系统开发中,设备间的可靠通信是核心需求。UART、I2C、SPI、CAN和Modbus这五种协议构成了嵌入式通信的基石,每种协议都有其独特的应用场景和技术特点。作为从业十余年的嵌入式工程师,我见证过太多项目因为协议选型不当导致的后期维护噩梦。本文将用实际工程案例带你深入理解这些协议的本质区别。
2. UART协议深度解析
2.1 基础原理与硬件架构
UART(Universal Asynchronous Receiver Transmitter)采用异步传输机制,仅需TX(发送)和RX(接收)两根信号线。其物理层通常采用TTL电平(0V表示逻辑0,3.3V/5V表示逻辑1)或RS-232电平(±3V至±15V)。在STM32F103系列MCU中,USART1的TX默认对应PA9引脚,RX对应PA10引脚。
关键点:异步通信意味着没有统一的时钟信号,双方必须预先约定相同的波特率。常见波特率有9600、115200等,计算公式为:
波特率 = 时钟频率 / (16 × USARTDIV)
其中USARTDIV是配置寄存器的分频系数
2.2 数据帧结构详解
一个完整的UART数据帧包含:
- 起始位(1位,低电平)
- 数据位(5-9位,通常8位)
- 校验位(可选,奇/偶校验)
- 停止位(1-2位,高电平)
以发送字符'A'(ASCII 0x41)为例,其8N1格式的波形如下:
code复制[起始位0][1][0][0][0][0][0][1][0][停止位1]
2.3 实战案例:GPS模块通信
NEO-6M GPS模块的典型配置:
c复制// STM32 HAL库配置示例
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
HAL_UART_Init(&huart1);
// 接收数据
uint8_t gps_buffer[100];
HAL_UAR
