串口接收不定长数据程序(适合没有空闲中断的单片机),采用的是定时器判断是否接收结束,程序在STM32F4探索者上测试发送间隔50ms以上不会出现粘包现象,20ms偶尔会出现粘包现象。
- typedef struct
- {
- uint8_t Rec_Flag;
- uint8_t Process;
- uint8_t timeout;/* 单位ms */
- uint8_t Rx_Length;
- uint8_t Tx_Buf[64];
- uint8_t Rx_Buf[64];
- }USART_RTx_TypeDef;
- extern USART_RTx_TypeDef USART2_RTx;
- void USART2_IRQHandler(void)
- {
- IF(LL_USART_IsActiveFlag_RXNE(USART2) != RESET)
- {
- USART2_RTx.Rx_Buf[USART2_RTx.Rx_Length++]=USART2->DR;
- switch(USART2_RTx.Process)
- {
- case 0:
- USART2_RTx.Timeout=3;
- USART2_RTx.Process=1;
- LL_TIM_EnableCounter(TIM1);
- break;
- case 1:
- USART2_RTx.Timeout=3;
- break;
- default:
- USART2_RTx.Timeout=0;
- USART2_RTx.Process=0;
- LL_TIM_DisableCounter(TIM1);
- break;
- }
- }
- }
- void TIM1_UP_TIM10_IRQHandler(void)
- {
- /* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
- if(LL_TIM_IsActiveFlag_UPDATE(TIM1) != RESET)
- {
- LL_TIM_CleaRFlag_UPDATE(TIM1);
- USART2_RTx.Timeout--;
- if(USART2_RTx.Timeout == 0)
- {
- USART2_RTx.Rec_Flag=1;/* 接收完成标志 */
- LL_TIM_DisableCounter(TIM1);
- USART2_RTx.Process=0;
- }
- }
- }
复制代码最后依然为大家提供一些资料,希望在某种程度上帮到大家
|