【usart中断接收数据并进行处理】由于回调函数中尽量不要处理太多数据,故放在while(1)循环中进行处理

usart.c中添加如下代码

/**********串口中断*/
#include <string.h>

char RxBuffer[RXBUFFERSIZE];   //接收数据
uint8_t aRxBuffer;			//接收中断缓冲
uint8_t Uart3_Rx_Cnt = 0;		//接收缓冲计数
uint8_t rx_complete_flag=0;//接收标志


///串口中断
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart==&huart3){


  /* Prevent unused argument(s) compilation warning */
  UNUSED(huart);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_UART_TxCpltCallback could be implemented in the user file
   */

	if(Uart3_Rx_Cnt >= 255)  //溢出判断
	{
		Uart3_Rx_Cnt = 0;
		memset(RxBuffer,0x00,sizeof(RxBuffer));
		HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
		HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
	}
	else
	{
		RxBuffer[Uart3_Rx_Cnt++] = aRxBuffer;   //接收数据转存

		if((RxBuffer[Uart3_Rx_Cnt-1] == 0x0A)&&(RxBuffer[Uart3_Rx_Cnt-2] == 0x0D)) //判断结束位
		{
			//HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer, Uart3_Rx_Cnt,0xFFFF); //将收到的信息发送出去
			//while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
			rx_complete_flag=1;

		}
		else
		{
			HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
		}
	}


	}
}
float str_to_float(uint8_t*str)//从接收的字符串转为float型数据
{
	float result=0.0;
	sscanf((char*)str,"%f",&result);
	return result;
}

main.c

 /******串口屏收到数据的处理**************************************/
while(1)
{
	  	  if(rx_complete_flag)
	  	  {///如果接收到了数据


	  		  memset(rxbuffer,0x00,sizeof(rxbuffer)); //清空rx数组
	          sys_measure_flag=1;//开启测量
	  		  rx_complete_flag=0;

	  		  for(int i=0;i<Uart3_Rx_Cnt-2;i++)//去掉0x0d 0x0a
	  		  {
	  			   rxbuffer[i]=RxBuffer[i];
	  		  }

	  		 PE4302_s=str_to_float(rxbuffer);
	  		//  Uart_printf(&huart1,"pe4302_s=\"%.2lf\"\r\n",PE4302_s);
	  		  PE43xx_changelevel(PE4302_s);//衰减多少db
	  		  memset(RxBuffer,0x00,sizeof(RxBuffer)); //清空数组
	  		  Uart3_Rx_Cnt = 0;//清零计数

	  		//	 d=PGA-PE4302_s;
	  			 HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer, 1);   //再开启接收中�?????
	  			 break;
	  	  }

}

这里的函数整个写在一个while(1),是因为在本系统的设计中希望先接收到串口屏键盘输入的数据,再来决定衰减器的衰减倍数,之后跳出while(1),进入幅值,频率测量的循环中。

串口屏部分设计:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值