1. 串口通信基础与传输模式选择
串口通信作为嵌入式系统中最基础也最常用的通信方式,其核心在于数据在设备间的可靠传输。在实际项目中,我们通常面临两种传输模式的选择:阻塞式传输和中断传输。这两种模式在STM32等主流MCU的HAL库中都有完善支持,但它们的适用场景和实现方式却大不相同。
阻塞式传输模式下,CPU会一直等待整个传输过程完成才会继续执行后续代码。这种模式简单直接,适合在简单的单任务系统中使用。比如当我们通过串口发送一个简单的配置命令时,可以这样实现:
c复制uint8_t configCmd[] = {0xAA, 0x55, 0x01};
HAL_UART_Transmit(&huart1, configCmd, sizeof(configCmd), HAL_MAX_DELAY);
这里的HAL_MAX_DELAY参数表示无限等待,直到传输完成。而接收数据时,我们可能会使用全局缓冲区g_Rx_Buffer:
c复制uint8_t g_Rx_Buffer[128];
HAL_UART_Receive(&huart1, g_Rx_Buffer, sizeof(g_Rx_Buffer), HAL_MAX_DELAY);
中断传输则完全不同,它不会阻塞主程序运行。当传输完成后,会触发中断回调函数。这种方式特别适合在多任务系统或需要实时响应的场景中使用。HAL库中中断传输使用的缓冲区指针通常命名为pTxBuffPtr和pRxBuffPtr,它们指向应用程序提供的缓冲区。
关键选择:在简单的调试输出或初始化配置时,阻塞式传输更简单可靠;而在需要高效利用CPU或处理实时数据的场景中,中断传输是更好的选择。
2. 阻塞式传输的深入解析与g_Rx_Buffer实现
阻塞式传输的核心特点是同步等待,这种模式下,数据缓冲区g_Rx_Buffer的使用有诸多需要注意的细节。g_Rx_Buffer作为全局变量,其生命周期贯穿整个程序运行过程,这使得它在简单应用中非常方便,但也带来了潜在的风险。
一个典型的阻塞式接收实现如下:
c复制#define RX_BUFFER_SIZE 64
uint8_t g_Rx_Buffer[RX_BUFFER_SIZE];
void UART_ReceiveData(void)
{
HAL_StatusTypeDef status;
status = HAL_UART_Receive(&huart1, g_Rx_Buffer, RX_BUFFER_SIZE, 1000);
if(status == HAL_OK)
{
// 数据处理逻辑
ProcessReceivedData(g_Rx_Buffer, RX_BUFFER_SIZE);
