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),进入幅值,频率测量的循环中。
串口屏部分设计: