你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

HAL库串口接收中断函数的一种使用方法

[复制链接]
feiting94 发布时间:2015-11-24 19:41
用过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;
复制代码


收藏 3 评论21 发布时间:2015-11-24 19:41

举报

21个回答
风子 回答时间:2015-11-24 22:41:49
谢谢分享
wangzhenassd 回答时间:2015-11-25 04:03:22
谢谢分享!
超級稻草人 回答时间:2015-11-25 08:30:40
谢谢分享,论坛里关于HAL库的应用讲解信息不是很多。。。
hithfy 回答时间:2015-11-25 08:59:02
嗯,一个字节式的接收,这样最后实现了没?
feiting94 回答时间:2015-11-25 11:00:08
hithfy 发表于 2015-11-25 08:59
嗯,一个字节式的接收,这样最后实现了没?

什么叫一个字节式的接收啊
hithfy 回答时间:2015-11-25 15:40:20
feiting94 发表于 2015-11-25 11:00
什么叫一个字节式的接收啊

HAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊?
stary666 回答时间:2015-11-25 16:54:45
看看,,,,,,,,,,,,,,,,,,,,,
feiting94 回答时间:2015-11-25 17:40:54
hithfy 发表于 2015-11-25 15:40
HAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊? ...

是的,但这里可以一次性接收最多为200字节的字符串,以 0x0d 0x0a 结束,这样就可以不用知道要接收多少个字节了
peter001 回答时间:2015-11-25 17:51:36
谢谢分享
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版