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

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

[复制链接]
feiting94 发布时间:2015-11-24 19:41
用过HAL库的坛友想必对串口接收中断函数
& \- B7 G# f0 x; e9 Y5 MHAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)7 F" O4 V1 [/ i
中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数
# W7 l- r4 z9 \$ G& a/ wHAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);/ o. r6 ?3 w$ G+ B7 K
7 p) `9 `0 |( |
最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束% o8 t' w8 ^% u/ H/ |& y' G! M
每次中断接收一个字符,
& {4 z" q# `* v: S- f
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    5 R; m2 S9 H# `2 B$ b
  2. {
    " \. q( \' \5 \" R7 X
  3.         if(huart == &huart6)* G' c) Z/ K8 }, t" W) L* |
  4.         {
    % b8 Z5 c1 i  S; |9 \# H
  5.                 if((USART_RX_STA&0x8000)==0)//接收未完成
    : R+ e$ Z( G5 S! `* O* b3 `" o
  6.                 {
    3 v5 w7 F4 B# j
  7.                         if(USART_RX_STA&0x4000)//接收到0x0d
    4 s& {# t; b9 R# @9 G
  8.                         {9 P; e) K/ Z' O" B7 _  V- G& U
  9.                                 if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始6 |" U+ m: X- I/ t5 p
  10.                                 else   k8 g1 i4 c# D5 i4 K
  11.                                 {7 s+ C# p' T/ F4 }
  12.                                         USART_RX_STA|=0x8000;        //接收完成
    4 G: f' `! r, Q, ]
  13.                                 }
    : V# y) _3 [' r( _
  14.                         }
    % f2 \5 V' a! F. @4 A0 F4 ]
  15.                         else //还没收到0x0d
    / i3 \( d3 v- z+ j' s9 s$ w" A# z
  16.                         {       
    9 n5 Y1 z' G1 y0 O
  17.                                 if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)/ t$ P1 h* q5 R1 v/ H
  18.                                 {3 a8 j; D3 Q- Q6 D3 e/ B* ?8 q
  19.                                         USART_RX_STA|=0x4000;: L) B6 _6 n, b0 {4 A2 [) m  H( H
  20.                                         USART_RX_STA++;' p' h' d7 Z; R# U; }
  21.                                         HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);: L5 e  J! m# ^! n+ G
  22.                                 }+ f8 e( v) g: ~% `2 ?; f* g0 b
  23.                                 else
    # Z2 [5 I( \, n
  24.                                 {
    : C" n/ C4 w3 t& S6 s0 m) o# L( q9 C
  25.                                         USART_RX_STA++;
    2 ^; V7 i4 e) z% _; ~/ X' D
  26.                                         if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始
    " D/ n! {( x, Q! [" y( H
  27.                                         HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);                                                    
    ' z+ c, W. v  P3 ]) i2 _1 S4 a
  28.                                 }                 
    " _8 t& R3 c# U9 ]% h+ s% y
  29.                         }
    ; E) j5 q: _( i  I" ]! B& [
  30.                 }                  l! V# c# Q/ v& B
  31.         }/ c) R) r2 _$ j# {# D
  32. }
复制代码
其中
, N: H6 O4 T+ d3 y; \
  1. uint8_t cc2541_rx_at_buff[USART_REC_LEN];
      j. H( V- |/ q  x5 \4 I$ f  g
  2. //接收状态5 v8 P; u5 ~7 u+ k# {% F9 g8 Q
  3. //bit15  接收完成标志. ~6 `& C! s) T: N* `: y4 m
  4. //bit14  接收到0x0d1 Q* ~- C$ F3 T) p* i& o3 g, O
  5. //bit13  接收到有效字节数目
    * L' m* }6 E* M5 s* F' f
  6. uint16_t USART_RX_STA=0;       //接收状态标记
复制代码
  1. #define USART_REC_LEN                          200          //定义最大接收字节数
复制代码
在主函数里面,就可以这样写
  M5 i8 E! W8 |; w. N
  1. HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);" B; E% ^4 J- l& W/ F' g2 ?
  2. while( (USART_RX_STA & 0x8000) == 0);5 f: l4 y6 F- I8 k1 W/ N
  3. //4 j4 |2 r# e! e5 x* v
  4. 自己的代码3 W" z& k9 c' M9 c4 _! Y
  5. //
    0 j# x  b) j/ i& H) ?7 ?; }+ y3 {
  6.         uint8_t i=0;
    ; ?* {: @, ]' R% n8 u4 e, I
  7.         for(i=0;i< (USART_RX_STA & 0x3FFF); i++)/ t! u/ `7 H& s
  8.                 cc2541_rx_at_buff[i] = '\0';
    " V7 |0 ^& `9 X
  9.         USART_RX_STA = 0;
复制代码
" F: z8 M, N' K" k
& s: W/ s- K* b1 F# X
赞 收藏 3 评论21 发布时间:2015-11-24 19:41

举报

21个回答
em78p156 回答时间:2016-4-13 15:31:36
串口在成功接收一行信息后,就不会再接收数据了。因为完成接收后没有打开接收中断,而主程序处理完把USART_RX_STA清0后也没有打开中断。需要在USART_RX_STA = 0;后增加一句HAL_UART_Receive_IT(&huart1,&Rxbuff[0],1);//开启接收中断
feiting94 回答时间:2015-11-25 17:40:54
hithfy 发表于 2015-11-25 15:40. z0 o  f6 p/ v- p
HAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊? ...
/ {$ v1 G5 L5 U% y% ~6 b$ y
是的,但这里可以一次性接收最多为200字节的字符串,以 0x0d 0x0a 结束,这样就可以不用知道要接收多少个字节了
夏义道 回答时间:2016-6-5 12:14:51
em78p156 发表于 2016-4-13 15:31
- j* m5 a+ v7 u! w串口在成功接收一行信息后,就不会再接收数据了。因为完成接收后没有打开接收中断,而主程序处理完把USART_ ...
+ z8 z3 j' b; K) W6 L, B
楼主主函数那段代码应该是放在while(1)里面吧,所以不用加
风子 回答时间:2015-11-24 22:41:49
谢谢分享
wangzhenassd 回答时间:2015-11-25 04:03:22
谢谢分享!
orima 回答时间: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- ^, X5 ?* j$ W3 z
嗯,一个字节式的接收,这样最后实现了没?
5 H1 S, n6 }7 t8 ], L
什么叫一个字节式的接收啊
hithfy 回答时间:2015-11-25 15:40:20
feiting94 发表于 2015-11-25 11:00
8 m: k# z9 Y1 u+ R什么叫一个字节式的接收啊

1 t- M7 Z: n$ w9 ]  O2 AHAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊?
stary666 回答时间:2015-11-25 16:54:45
看看,,,,,,,,,,,,,,,,,,,,,
peter001 回答时间:2015-11-25 17:51:36
谢谢分享
党国特派员 回答时间:2015-11-25 22:11:01
其实串口之提供一种通讯方式,而通讯的协议要靠自己去实现。
埃斯提爱慕 回答时间:2015-11-25 22:17:13
提示: 作者被禁止或删除 内容自动屏蔽
tempchar 回答时间:2015-11-25 23:50:44
接收到的数据的长度可以从huart的rxXferSize-rxXFerCount计算出来。" b7 B* j3 ~. t) {# R
需要接收到数据就马上进行处理的话可以修改it.c里的串口中断irqhandler
hithfy 回答时间:2015-11-26 08:27:17
feiting94 发表于 2015-11-25 17:40
: s2 l* Z" |* y* f是的,但这里可以一次性接收最多为200字节的字符串,以 0x0d 0x0a 结束,这样就可以不用知道要接收多少个 ...

1 ?& ^% {9 t8 C4 Z+ m. H嗯,自己的思想+库函数就是创新!
12下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版