char RxBuffer[size]={'a'};//接收缓存数组
char *p;//指向数组的指针,用于接收
int count_time=0;//记录上次传输时的时钟心跳
int count=0;//统计收到的个数
uint32_t temp_state=0;//获取UART的状态
char rec_flag=0;//表示接收完成与否,超时则认为接收完成
p=RxBuffer;
HAL_UART_Receive_IT(&huart1,(uint8_t*)p,1);//先启动一次接收,存放到缓存数组
count_time=HAL_GetTick();
temp_state=HAL_UART_GetState(&huart1);//获取UART状态
if(temp_state==HAL_UART_STATE_BUSY_RX||temp_state==HAL_UART_STATE_BUSY_TX_RX)//在接收中
{
if((HAL_GetTick()-count_time)>1000)//如果超时,表示接收已经完成,设置标志
rec_flag=1;
}
elseif(temp_state==HAL_UART_STATE_READY)//uart空闲中,则表示一次接收完成,空闲中
{
if(p==RxBuffer+100)//接收的指针不能超出数组
p=RxBuffer;
else
p++;//指针变化
if(count==100)//接收的数量不能超出缓存数组的个数
count=100;
else
count++;//记录个数
count_time=HAL_GetTick();//接收一个更新一次时间,以便于计算超时
HAL_UART_Receive_IT(&huart1,(uint8_t*)p,1);//在启动一次新的接收
}
if(rec_flag==1)//如果接收完成
{
if(count!=0&&count<=100)//个数是在正常分为之内,和以下共同部分可以优化
{
while(HAL_UART_Transmit_IT(&huart1,(uint8_t*)RxBuffer,count)!=HAL_OK);//将收到的东西全部发到串口。
count=0;//重新初始化赋值一些值
p=RxBuffer;
count_time=HAL_GetTick();
rec_flag=0;
}
else
{
count=0;
p=RxBuffer;
count_time=HAL_GetTick();
rec_flag=0;
}
//以下目的是修改uart的状态,因为在超时的时候,uart正在接收数据,而存放的地址在缓存数组的不确定位置。修改状态为huart1.State=HAL_UART_STATE_BUSY_TX或者HAL_UART_STATE_READY才可以进去,再一次使用HAL_UART_Receive_IT函数
temp_state=HAL_UART_GetState(&huart1);
if(temp_state==HAL_UART_STATE_BUSY_TX_RX)
huart1.State=HAL_UART_STATE_BUSY_TX;
else if(temp_state==HAL_UART_STATE_BUSY_RX)
huart1.State=HAL_UART_STATE_READY;
HAL_UART_Receive_IT(&huart1,(uint8_t*)p,1);//在启动一次新的接收
}
}