单片机 stm32 接收数据和处理

单片机 C语言 专栏收录该内容
7 篇文章 1 订阅

背景

1、单片机串口接收数据处理,这个代码已经过很多项目验证,没有问题。用这个代码帮了好几个同事解决数据接收久了就异常。
2、这个代码做到接收和处理分开。避免不必要的处理逻辑问题。
3、也可用于网口tcp,udp,spi,iic等方式。
缺陷 :
1、接收和处理两个缓存区,比较吃内存,不过现在单片机内存大,不是问题。
2、接收和处理分开,响应没那么及时。现在芯片主频都高,可以忽略。

实现

//缓存区根据实际情况修改
#define   UART_RX_BUFSIZE               16  	 // receive
volatile  uint8_t      UART_RXBuffer[UART_RX_BUFSIZE]; // receive
volatile  uint8_t      UART_RXReadIndex = 0, UART_RXWriteIndex = 0; // receive buffer indexes :
volatile  uint8_t      UART_RXCharCount = 0; // count of received bytes:

//根据实际情况修改
typedef  struct _REC_TYPE
{
    uint8_t   Head;
    //uint8_t   OptCode;
    //uint16_t  DataLen;
    uint8_t   DataBuf[5];

    uint8_t   Tail;

} REC_TYPE;

typedef union REC_DATA_TYPE
{
    REC_TYPE  data_type;
    
	//根据实际情况修改
    uint8_t   data_arry[16];

} REC_DATA;

REC_DATA  uart_rec_buffer;//16byte

uint8_t uart_rec_count = 0;
uint16_t uart_timeout_count = 0;


//中断接收,根据实际芯片修改
void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
      USART_ClearITPendingBit(USART1,USART_IT_RXNE); 
      
     UART_RXBuffer[UART_RXWriteIndex++] =USART_ReceiveData(USART1);
		UART_RXWriteIndex &= UART_RX_BUFSIZE - 1;
		UART_RXCharCount++;
  }
}
//读取缓存数据
uint8_t UART_Ci_ReadChar ( void )
{
    register uint8_t Byte;
	
    if ( UART_RXCharCount )
    {
        Byte = UART_RXBuffer[UART_RXReadIndex++];
        UART_RXReadIndex &= UART_RX_BUFSIZE - 1;
        
        UART_RXCharCount--;
        
        return Byte ;
    }
    return 0;
}

void Uart_process_rec_data(void)
{
	
	 uint16_t m_ui16Data;

	if ( UART_RXCharCount )
    {
        //设置超时初值
        uart_timeout_count =	50000;
        uart_rec_buffer.data_arry[uart_rec_count] = UART_Ci_ReadChar();
        uart_rec_count++;
    }
	//添加超时处理
    if ( uart_timeout_count>0 )
    {
        uart_timeout_count--;
    }
    else
    {
        uart_rec_count = 0;
    }
	if ( uart_rec_count > 0 && uart_rec_buffer.data_type.Head == 0xff )
	{
		//这里添加类型处理

		//7是帧长度,根据实际情况修改
		if(uart_rec_count>=7)
		{
			//记得清0
			uart_rec_count = 0;
			if(uart_rec_buffer.data_type.Tail==0x00)
			{
				//数据处理
			}
			
		}
	}
	else
	{
		uart_rec_count = 0;
	}
}


  • 6
    点赞
  • 3
    评论
  • 29
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值