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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STM32 UART串口在中断中不能循环接收数据帧的问题) S  j# Q* L/ l; D2 i9 ~% U# |

2 e6 E+ W# P4 A; p7 P3 j! }2 O+ h# Y; b; ^4 L8 ~) ]9 U" O
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD  9 X) b, d8 ]) Q9 n: R* Q
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,
- H' [  f: T2 k4 ~: v& r+ I8 p
% t0 E/ L" l, q不知道为什么啊?代码如下:
0 C5 h& G& s1 U: D0 ?void Systick_Handler(void)
" p) p0 R1 V9 y+ L: b" d6 k; H6 Z: V& t{
- U1 j9 \) y6 Y  T" q   if (TimingDelayBuffer != 0x00)( a6 r+ S* W: ]5 l" G
   { . q0 q' i6 k9 q+ W$ l8 H; w6 o+ y
      TimingDelayBuffer--;6 j( z5 I3 h0 o
   }1 ^) Y1 L6 }) U! Z, S( f. e
}
5 n2 p- ]3 e; \" M2 H
3 u$ j! ]5 o) q1 N2 O$ zvoid USART1_IRQHandler (void) * F1 `6 I) ~) Q. Z
{3 Q+ q+ }' d3 X% ^" Q7 s. R
   unsigned char i = 0;) Z* m. w' G8 C3 t. L5 j
5 x; v/ A- Y% T* |( x1 ^9 V
     if (USART1->SR & USART_FLAG_RXNE)   // read interrupt) a/ j, J- ^# n: n' j7 V
     {
8 h4 n" I( [4 v0 z2 [% e, j; A      USART1->CR1 &= USART_FLAG_RXNE;          // Disable the USART Receive interrupt4 S$ U  J+ O( X/ z- Y9 |+ W, x
      6 F1 U  k1 h& Y3 J; z- @
      RxCounter = 0;2 y9 I5 A6 N3 l9 j7 {3 K& R1 w
      RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
! k& l" T2 o( ~! v. C& _2 B8 p2 [9 b      USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag$ K: c' P, W: C# b7 ^$ H
  
9 B' k1 N0 ?; E, S' R  for (i=0; i<30; i++)
8 S/ P# c- Q/ p9 O  {5 s8 `; r8 Y$ E( D6 T
   SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。
9 x- R- D0 O" A- b  {, R6 d   TimingDelayBuffer = 1000;6 |; y, F: j2 s3 a
# c1 U5 T9 M( A; @: l
   while (!(USART1->SR & USART_FLAG_RXNE))
* j4 J8 D) `" T% A" `8 O3 I   {, o; a: U) f+ s
     if (TimingDelayBuffer == 0) //定时一秒没有数据就退出
( d4 Q3 I( ~& _% G     {
; s- f& }+ h' O7 u      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
9 h5 d/ r! v4 V5 }' o      return;
3 S7 s- e1 j1 }) W     }' n1 d; [/ |9 N0 d3 G% H  @( b
     ' |$ e. B9 D* Y' H* W" t8 ]& w
   }1 b! y% I" [* d$ I- a% k) [
   
3 C1 Y, Y/ F% \* U0 }3 F   SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
- o7 m! r; g. Y     SysTick->VAL = SysTick_Counter_Clear; //计数器清0' W$ \/ ?3 A' T! v3 l
     9 N6 K" `- G. j* ~2 y+ ?  R3 p
       RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
3 F& |. ~, l) y0 W       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
/ C' s6 q" j6 N# x5 I8 o. q, t/ H3 W      
4 B" ~$ B# h+ i1 {' _   if (RxBuffer[RxCounter] == 0xFD)2 {7 U/ w0 {- s/ t  ~- \
   {7 G% {$ n9 \- \) N1 u. G; @
    RxdDisposeFlag = 1;
/ p7 ^" R6 s. J* I    return;
& v" \. a- E* ^' M, A8 ?' T   }
3 n8 h4 n- I* a   
. F) U2 m! ]/ K- W. D6 S   RxCounter++;$ }: Z9 b# p% D4 {
  }( l6 n+ H8 r( z0 \! }
  
. ], A! n' i) r/ C& H      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt / o* t2 i  k3 |. S
     }
. X0 J+ l- [7 |  ^/ G( Y}5 P: U7 O4 L$ G0 C" L/ }5 g9 l

* Y7 C# |% I& g

该用户从未签到

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)0 L" _+ H5 i1 N9 u1 f! I! Q' K. Q: d
{
; R3 L* @- i/ M        unsigned char temp=0;
& b6 r( Q! E% u7 N' ^& O, o        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)/ m3 k2 ^4 Q( d4 ^* A4 J! E+ b
        {# n- n4 [2 E+ S6 _* E# K
                temp=(unsigned char)USART_ReceiveData(USART1);( |. I4 S7 Q0 h, ~% d% x
                if(RxBuf1CNT<SERIAL_BUFF_SIZE)
! O; S6 @* ]2 E                {* e3 s) @& n: P1 p& r- S
                        RxBuf1[RxBuf1CNT++]=temp;
3 C1 ]7 @0 n: c                }
8 |8 S  C0 H  f* F! w! [                else3 b8 E& {# O3 @+ p/ J
                {
; h0 }. Q! P& H9 b5 x- ]                        RxBuf1CNT=0;2 r+ i6 h% T6 n2 I' n9 C+ C
                }! l. S2 x9 g- I# c8 V
        }
1 F% m% z; }% g( g, L2 l# v}2 M( x% B' ?% r3 ?4 P6 ~
我是这么用的,可以正常使用,是不是你的USART初始化有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-3 20:56 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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