打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
STM32cube学习笔记UART实现接收任意长度
    实现接收任意长度,并返回任意长度
  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;
  }
  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);//在启动一次新的接收
 }

  }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【STM32Cube】(六)使用 STM32CubeMX初始化usart(查询发送和查询接收模式)
STM32HAL库与标准库的区别
串口接收不定长数据的几种方法,学会横着走!
STM32 之 HAL库
STM32 解析futaba S
STM32 之 HAL 库串口 USART 丢数据及ORE卡死的解决方案
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服