[应用相关] HAL库串口接收中断函数的一种使用方法

[复制链接]
2734|3
 楼主| Roderman_z 发表于 2016-4-27 20:45 | 显示全部楼层 |阅读模式
用过HAL库的坛友想必对串口接收中断函数
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束
每次中断接收一个字符
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3.         if(huart == &huart6)
  4.         {
  5.                 if((USART_RX_STA&0x8000)==0)//接收未完成
  6.                 {
  7.                         if(USART_RX_STA&0x4000)//接收到0x0d
  8.                         {
  9.                                 if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
  10.                                 else
  11.                                 {
  12.                                         USART_RX_STA|=0x8000;        //接收完成
  13.                                 }
  14.                         }
  15.                         else //还没收到0x0d
  16.                         {        
  17.                                 if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)
  18.                                 {
  19.                                         USART_RX_STA|=0x4000;
  20.                                         USART_RX_STA++;
  21.                                         HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
  22.                                 }
  23.                                 else
  24.                                 {
  25.                                         USART_RX_STA++;
  26.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始
  27.                                         HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);                                                   
  28.                                 }                 
  29.                         }
  30.                 }               
  31.         }
  32. }
其中
  1. uint8_t cc2541_rx_at_buff[USART_REC_LEN];
  2. //接收状态
  3. //bit15  接收完成标志
  4. //bit14  接收到0x0d
  5. //bit13  接收到有效字节数目
  6. uint16_t USART_RX_STA=0;       //接收状态标记
  1. #define USART_REC_LEN                          200          //定义最大接收字节数
  1. HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);
  2. while( (USART_RX_STA & 0x8000) == 0);
  3. //
  4. 自己的代码
  5. //
  6.         uint8_t i=0;
  7.         for(i=0;i< (USART_RX_STA & 0x3FFF); i++)
  8.                 cc2541_rx_at_buff[i] = '\0';
  9.         USART_RX_STA = 0;


wahahaheihei 发表于 2016-4-27 22:17 | 显示全部楼层
Callback
楼主,一般这种函数是干啥的,我看HAL库里每个外设都好多带Callback的函数,说是回调函数,但是实在是无法理解。
bayuan0414 发表于 2016-4-28 00:48 | 显示全部楼层
wahahaheihei 发表于 2016-4-27 22:17
Callback
楼主,一般这种函数是干啥的,我看HAL库里每个外设都好多带Callback的函数,说是回调函数,但是 ...

可以用来作异步通信。比如你有一堆数据要发送,同步的方式就是你调用一个发送函数,等函数返回时,数据全部发送完了;异步的方式是你调用一个发送函数,然后它立即返回,这个时候数据还在发送中(若数据少,也可能发送完了),那么你怎么知道它什么时候传送完呢?给它个回调函数,它发送完的时候,调用你注册的回调函数来通知你。
wahahaheihei 发表于 2016-4-28 23:04 | 显示全部楼层
bayuan0414 发表于 2016-4-28 00:48
可以用来作异步通信。比如你有一堆数据要发送,同步的方式就是你调用一个发送函数,等函数返回时,数据全 ...

原来如此,非常感谢楼主花时间给我讲解。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部