找回密码
 注册
关于网站域名变更的通知
查看: 1207|回复: 3
打印 上一主题 下一主题

求助:STM32 UART串口在中断中不能循环接收数据帧的问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-11 09:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
STM32 UART串口在中断中不能循环接收数据帧的问题5 l& w/ Z  K( |% H/ G

9 H3 C" u- g. K/ o& N% X* K$ m8 o, u' @3 ?; U5 r
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD  # h6 s; ~$ I+ R/ O( d
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,  t3 e! ]' f. M% f

3 {' [. X0 P  F3 D% z8 W/ {不知道为什么啊?代码如下:
# i! n/ U, s% B1 C) O, e# n2 P. k6 v" uvoid Systick_Handler(void)
# s1 C' Z% |6 i& _+ x% g6 ~$ n{7 ]9 `0 d3 [  P0 W0 J
   if (TimingDelayBuffer != 0x00)
; s4 @/ i+ Q6 M9 R   {   _  o9 {1 Z% k
      TimingDelayBuffer--;
3 ]" u! H, d2 P; D9 j( c6 I4 o   }
3 t3 I. T- i7 D}1 t: m5 y' _# [; j

0 W* i# V; h8 K6 x: l/ Tvoid USART1_IRQHandler (void)
0 g# s# `" H  Y7 A3 u; L" d{' z1 L* b) ?" \& u+ Q( S1 {
   unsigned char i = 0;
, z" P# }, [, t* ~! q% \5 j% N) F% U
     if (USART1->SR & USART_FLAG_RXNE)   // read interrupt
* M6 J  c' a0 l0 j' a     {: s6 e3 N3 L" R" T  K- T5 c1 v
      USART1->CR1 &= USART_FLAG_RXNE;          // Disable the USART Receive interrupt
; C/ j# T( m+ j8 t      : T2 [+ ?# M6 m6 }' k6 D0 Y. l
      RxCounter = 0;
& X( W& n1 ]2 x      RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
4 S9 W* G0 {" k      USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
) H# |+ B4 ], L, Y- B' S& f  
( y. j$ u7 b% C4 B6 o  for (i=0; i<30; i++)* D( G! @$ g& F, v3 v1 C( m
  {
3 c/ h  h' E% L  `* x% r0 B: z   SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。
; A4 M( m' f: d  |; f, U   TimingDelayBuffer = 1000;" b/ a* y+ z/ G% W6 m0 A/ T  j, E

8 Y% R& ~! a* E+ v; l   while (!(USART1->SR & USART_FLAG_RXNE))
! v3 e9 Q( x2 a/ Q3 s  r8 K3 B$ Q   {
8 `- K# x3 [5 O8 @. X     if (TimingDelayBuffer == 0) //定时一秒没有数据就退出. I/ h3 V* s, j5 O0 }5 {( d
     {
) e# X- W7 ?7 [2 R9 T      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
" f+ f" q+ R. F/ f      return;
( G9 ~( Q, \1 f  J" V     }
& S: K+ v9 z* k, W4 e. B     1 W1 J- B* V% Z# |
   }: W, |% t7 L. q5 ?
   
6 l. j# J3 z5 g6 Z( U   SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数0 v: Y( Z; K! N" l# J3 K: z9 `
     SysTick->VAL = SysTick_Counter_Clear; //计数器清0# q5 m% r  k2 j- C2 Y
     
3 b4 v1 S0 j2 p/ ~  W  t. I4 e       RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
8 C# E7 T4 [# j0 E       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag5 ?, O4 f% [; i  A% v! E8 w
       - h& s( j; j$ ]
   if (RxBuffer[RxCounter] == 0xFD)& O6 N- j  s$ z2 @! M- @* k
   {
$ o1 n( ^; ^- n    RxdDisposeFlag = 1;3 c3 D$ H4 {1 k
    return;3 T; b# F" K9 D6 g$ D  E
   }. O, h+ h" f4 S& Y' {
   # O3 B& }, {; e3 M6 b+ J
   RxCounter++;
; w9 I# J( u1 V3 K8 R  }( \& [& i2 b. O+ i
  
5 B& g& E) H& }+ Z) H" l- y" ^      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
. |- b) @! G! N     }& W% H5 v# F$ C1 m  h
}
9 ]! h+ p0 w; ^( Y" f4 k/ S

7 ^; n- V) F$ @& n( w  i8 M8 ]6 {

该用户从未签到

2#
发表于 2019-4-11 09:37 | 只看该作者
连接驱动没有问题吧

该用户从未签到

3#
发表于 2019-4-11 09:57 | 只看该作者
表示现在也遇到同样问题,不能根据USART_FLAG_RXNE标志来完成数据帧接收,51单片机RI是可以这么用,转到STM32不行

该用户从未签到

4#
发表于 2019-4-11 10:18 | 只看该作者
void USART1_IRQHandler(void)
/ R; O  g5 p  l( ]8 M2 k. }) y{
+ c- {2 G) K% R4 C3 Y4 u' m        unsigned char temp=0;* r! p' M; `# r1 m4 X/ V
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)! v7 z9 I' D$ Z! @2 y1 r- p
        {: d7 E+ {! \3 t0 `; J: z! p
                temp=(unsigned char)USART_ReceiveData(USART1);
; K% _0 \, g- \! t/ D$ F                if(RxBuf1CNT<SERIAL_BUFF_SIZE)
5 Q$ z! Q: H4 v6 N                {" U' K+ A+ }3 P% s" g
                        RxBuf1[RxBuf1CNT++]=temp;4 k* F+ v; K! y: P( k5 v1 k& F( v
                }
! |9 F$ P* g& q0 ]& }: L- Z. M                else- Z9 C4 r( o# D2 z0 H$ f0 ^
                {/ O& _- P  Y! ]; N
                        RxBuf1CNT=0;
( W  y; i( F! z) ~5 t1 D                }/ }! Q4 q7 Y% k. ~
        }+ x, T1 F! j& M( j. z
}( N8 O$ B% ?$ w5 b8 ^
我是这么用的,可以正常使用,是不是你的USART初始化有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-27 20:49 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表