Cubemx配置
跳过基础配置
串口配置
使能串口中断
代码部分及说明
代码
参数定义:
/***************************串口相关******************************/
uint8_t RxBuff[1]; //进入中断接收数据的数组
uint8_t Data_Uartbuff[5000]; //保存接收到的数据的数组
uint8_t Data_Uart[5000];
int RxLine=0; //接收到的数据长度
uint8_t Rx_flag=0; //接受到数据标志
uint8_t Data_Uartflag; //需要使用的数据更新成功标志
int Data_Uartcnt=0;//数据的长度
/****************************************************************/
串口中断回调:
需要在头文件 #include “string.h”
/**********************串口中断回调******************************/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == huart1.Instance)
{
static uint8_t step=0;
switch(step)
{
case 0: //开始检查头帧
if(RxBuff[0]=='#')
{
step++;
RxLine++;
Data_Uartbuff[RxLine-1]=RxBuff[0];
}
break;
case 1:
if(RxBuff[0]=='!')//判断结尾帧
{
//printf("ok2\r\n");
RxLine++;
Data_Uartbuff[RxLine-1]=RxBuff[0];
Data_Uartcnt = RxLine;
//printf("cnt的长度%d",Data_Uartcnt);
step=0;
RxLine=0;
Rx_flag=1;
}
else //接收数据
{
RxLine++;
Data_Uartbuff[RxLine-1]=RxBuff[0];
//printf("ok3");
}
break;
}
if(Rx_flag==1)//转移Buff中的数据
{
memcpy(Data_Uart,Data_Uartbuff,Data_Uartcnt);
memset(Data_Uartbuff,0,Data_Uartcnt);
Rx_flag = 0;
Data_Uartflag=1;
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1);
RxBuff[0]=0;
}
}
串口处理函数封装:
/**********************串口处理函数******************************/
void Uart_Deal(void)
{
if(Data_Uartflag==1)//串口数据处理
{
Data_Uartflag = 0;
HAL_UART_Transmit(&huart1,(uint8_t *)Data_Uart,Data_Uartcnt,0xffff);
if(Data_Uart[1]=='1')
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
printf("\r\n");
}
}
while(1)中
Uart_Deal();
while(1)之前初始化
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打开串口中断接收
说明
串口数据以#开始,以!结束