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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STM32 UART串口在中断中不能循环接收数据帧的问题
5 G: O- Q1 |' K0 f  l6 D' E3 [
- K/ g3 a. C0 t5 z
, V* h1 {; C) m& U! \我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD  
' E6 S2 Z0 j( L  \: g3 r这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,
- j$ c! W0 @: H. r9 l+ ~! R+ a( U7 N1 x7 @( ^
不知道为什么啊?代码如下:
* }5 F0 {. ^& G! _void Systick_Handler(void)1 {/ ^: j8 i, y$ c' N1 n" G
{
% c. Q0 q' N& B$ X" n2 Q3 h   if (TimingDelayBuffer != 0x00)- D: m% g  v5 s, J* q4 k& z5 W
   {
. v) x% D# b  d3 q      TimingDelayBuffer--;
/ N4 {( r1 q& C2 I( x% @# J+ ~& L   }. W% C1 z% x& Z% D: b+ z
}
) C2 R. W# k$ A' X$ {9 n5 W  ]+ M' e
void USART1_IRQHandler (void)
& |# b' e3 L! R1 X{2 c( O* f6 Q: y. g. x3 W
   unsigned char i = 0;: t% }2 B5 g8 K: P+ F

5 z& K/ H% W) l  C5 q& S' Y; R     if (USART1->SR & USART_FLAG_RXNE)   // read interrupt
) ~2 q( b2 e5 m8 O2 W+ `; _     {
6 g, Z( N; K3 O; `4 j! C      USART1->CR1 &= USART_FLAG_RXNE;          // Disable the USART Receive interrupt4 H4 k3 s+ c) d' F; w1 c
      
/ m; J! u) {: G! v. h/ g7 y      RxCounter = 0;$ W( ^1 @) [1 G# g
      RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
5 D* w  i5 r. \, }7 \1 n      USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
! n( g$ j# r/ v9 g) S! r, z  0 e/ u# u$ L4 q; A3 q
  for (i=0; i<30; i++)
, S# a9 {. _& x0 k! l0 s  {
' I- @" j8 K8 e& c* j   SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。5 U/ J: t+ l/ Q9 w9 J/ B) G6 G
   TimingDelayBuffer = 1000;
' b$ J# f* d( O! Z
& c& m$ D; e/ {/ T* L7 J" [   while (!(USART1->SR & USART_FLAG_RXNE))
( K! I; f; h) N$ J: z& y1 L   {
" U; R# a( q1 k; m4 d     if (TimingDelayBuffer == 0) //定时一秒没有数据就退出
" u! L. U* `* ^     {
( E+ |. A4 x8 c+ |* |, \      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt 2 ^4 E' x" u+ m: E: q) j
      return;, F* T+ L- U, G( q% a( C! \# f
     }
# z9 m- E: ?9 g1 O: h6 B8 ^; \     . k6 Q& b. R$ Z1 K4 t
   }1 `2 L5 o1 s  C' B$ S. U' \; y
   
; `6 Z; l2 A' j0 ?   SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
% j" y* D" `: B" S" v     SysTick->VAL = SysTick_Counter_Clear; //计数器清0* R4 z/ I3 d! G2 H9 U  G3 e6 P0 Y
     1 ]% a0 O7 ?$ Y$ W" H6 m8 `) \+ t4 q/ n
       RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));
6 N0 v! \2 y) D0 P       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
1 I1 Y* X7 G7 G3 b2 x  v* e6 `      
8 B% j3 V  O" P# g8 I1 m   if (RxBuffer[RxCounter] == 0xFD)( U% w* E) R5 y
   {- C( n  L! Y3 v! B2 X. z/ c
    RxdDisposeFlag = 1;/ H6 U& C: c0 j. v+ d
    return;& [- T1 `: n& x/ S4 y
   }! \1 U& }  G0 j
   , d" S" ]) Z4 j* p. B& N
   RxCounter++;
+ `( D" v: p# ~9 I6 U. T  }5 }# ~: v5 n7 t  F4 S9 s
  
8 d3 H! N- U* a* ~      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt
7 f! t4 j% |6 t9 H: {- V     }
5 N' V/ @. x) i}
; G& J7 i4 q9 s0 B5 t& R
+ Q  s6 G" M  d  s; P

该用户从未签到

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)7 i6 Z& W7 f) E% j; g# @. l
{
2 B$ L1 x! F) X3 M( P) E        unsigned char temp=0;
! d1 [  }$ x# A6 e" H5 S2 v3 D9 ^        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
0 U: l* m: r' H" r$ l        {. l2 k0 _/ f2 S) `( o
                temp=(unsigned char)USART_ReceiveData(USART1);
0 m- d0 J3 b; O3 D& R                if(RxBuf1CNT<SERIAL_BUFF_SIZE)
8 B" R" F) f1 |/ g- ^/ ~                {% }+ \. X( z7 f1 j  t/ m
                        RxBuf1[RxBuf1CNT++]=temp;) b- G+ o4 T$ L0 S( O# M
                }1 v; Z. [% I3 M0 |6 a, g
                else) k: |1 T  _) z8 N
                {
( }( Y' F0 y) O( @% k                        RxBuf1CNT=0;
+ ]% }1 T( q( X; p; j) f" U) ?                }
& D6 Y7 `% _0 A2 D        }
- k0 n* {+ o+ \4 P0 v, v5 e}, d4 r1 I# e* {9 i
我是这么用的,可以正常使用,是不是你的USART初始化有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-16 14:46 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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