分享

STM32cube学习笔记UART实现接收任意长度

 圆锥的布袋 2017-09-14
    实现接收任意长度,并返回任意长度
  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();

//以下是正文
while(1){
  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;
  }
  else if(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);//在启动一次新的接收
 }

  }

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多