STM32串口接收不定长数据:解决大数据传输难题
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串口接收不定长数据,有效避免串口延时处理和数据丢失问题,而且可移植性强,大家根据实际需求简单修改就能应用到自己的项目中啦。希望这篇博文对各位开发小伙伴有所帮助,赶紧动手试试吧!

更多推荐
所有评论(0)