STM32开发的串口接收不定长数据源码,。 可解决串口延时处理,数据丢失等适合串口传输大量数据,可移植性非常广,程序源码注释详细,非常适合开发人员,需要可以看下。

在STM32开发中,串口通信是极为常用的功能,但当涉及到传输大量数据时,串口延时处理和数据丢失等问题就会冒出来捣乱。今天咱就来分享一套能解决这些痛点、可移植性超广的串口接收不定长数据源码,代码注释超详细,开发小伙伴们不容错过。

核心思路

主要思路是利用串口中断来接收数据,同时设置一个缓冲区来暂存接收到的数据。通过判断数据结束标志,确定一帧数据是否接收完整。

代码实现

初始化串口

void USART_Init(void)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);

    // 配置PA9为复用推挽输出
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置PA10为浮空输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 串口基本配置
    USART_InitStructure.USART_BaudRate = 115200;
    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);

    // 使能串口接收中断
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    // 使能串口
    USART_Cmd(USART1, ENABLE);
}

这段代码首先使能了GPIO和USART的时钟,然后配置了PA9(TX)为复用推挽输出,PA10(RX)为浮空输入。接着对串口进行基本参数设置,包括波特率、数据位、停止位、校验位等,最后使能了串口接收中断并开启串口。

串口接收中断处理函数

#define MAX_RECV_LEN 200
uint8_t RecvBuff[MAX_RECV_LEN];
uint8_t RecvLength = 0;

void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
    {
        uint8_t temp = USART_ReceiveData(USART1);
        if (RecvLength < MAX_RECV_LEN)
        {
            RecvBuff[RecvLength++] = temp;
            if (temp == '\n') // 假设以换行符作为一帧数据结束标志
            {
                // 这里可以对接收到的数据进行处理
                // 例如解析数据、执行相应命令等
                RecvLength = 0; // 处理完后清空接收长度,准备接收下一帧
            }
        }
        else
        {
            RecvLength = 0; // 防止缓冲区溢出,清空重新接收
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }
}

在中断处理函数里,当检测到串口接收中断(USARTITRXNE)时,读取接收到的数据并存入缓冲区RecvBuff中。如果缓冲区未满,就持续存入数据。一旦检测到数据结束标志(这里假设是换行符'\n'),就可以对接收到的数据进行处理,处理完后重置接收长度,准备接收下一帧数据。要是缓冲区满了,为避免溢出,同样重置接收长度。最后别忘了清除中断标志位。

STM32开发的串口接收不定长数据源码,。 可解决串口延时处理,数据丢失等适合串口传输大量数据,可移植性非常广,程序源码注释详细,非常适合开发人员,需要可以看下。

这样一套代码下来,就能较为稳定地实现STM32串口接收不定长数据,有效避免串口延时处理和数据丢失问题,而且可移植性强,大家根据实际需求简单修改就能应用到自己的项目中啦。希望这篇博文对各位开发小伙伴有所帮助,赶紧动手试试吧!

更多推荐