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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STM32 UART串口在中断中不能循环接收数据帧的问题* l, F6 a# R* [8 N# W) ?
+ U6 \: v. D" w6 s( c
, y* g. J7 p$ s
我要用STM32的串口接收一帧这样类型的数据:01 xx xx xx xx xx xx xx FD  6 I8 y6 f6 d$ [
这个数据长度不超过30个,结束字节是FD(数据里面没有FD)。我的程序设计是这样的,当接收到串口数据后进中断处理,循环接收数据,直到接收到的数据是FD就退出中断(中间断接收超时处理)。程序思路如:进中断后,关闭接收中断,通过读取USART_FLAG_RXNE标志来接收数据。我现在遇到的问题是在中断中不能根据USART_FLAG_RXNE标志来完成数据阿帧接收,
- G7 D8 B, _. R' y  B- z, e4 Y7 r! |7 c4 T1 A
不知道为什么啊?代码如下:
" r2 F% m0 ^# g8 }: x, _5 Vvoid Systick_Handler(void)
9 H  @( k6 x5 K# R{
1 T( D; v4 {) E7 W. \" v   if (TimingDelayBuffer != 0x00)
+ t8 f& V1 O2 _   { " F3 I3 t5 m/ w, }* l1 L
      TimingDelayBuffer--;, z& y+ n: u& f- u5 ~* T- t4 `* ?
   }; E8 V+ V% W9 j( H3 _7 r5 b
}
# o6 ^7 Z5 a4 S' j3 A
& h, f  _3 y4 w7 Z" R+ [' G/ y; fvoid USART1_IRQHandler (void)
# m6 L  t# n  _{; E, m: I7 z" t8 J4 z, L5 y
   unsigned char i = 0;
! L# W! e2 M# K, Q9 n* ?( B9 N( o# d) e4 G! R0 b% w( S  [2 h
     if (USART1->SR & USART_FLAG_RXNE)   // read interrupt3 f2 K: `7 `; i# k2 _: H: c
     {
, S+ V4 ]5 Y. V: h( }6 m( w      USART1->CR1 &= USART_FLAG_RXNE;          // Disable the USART Receive interrupt
3 y" Y1 f1 J; i3 _% @8 k# ?8 p      $ q. w0 K# i" ~1 U% D9 `
      RxCounter = 0;
% L0 {7 A. k# J' M      RxBuffer[RxCounter++] = ((int)(USART1->DR & 0x1FF));
6 p2 \5 |+ j( [8 L0 k! B& [      USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag
& `7 m+ [4 s7 D9 Y1 O  
1 N$ B; p. w, K  T0 h  for (i=0; i<30; i++)
4 M3 T+ @, Z8 d4 p- D+ C  {
. C/ ?. _! I) M& V  J6 g3 Z- l0 k   SysTick->CTRL |= SysTick_Counter_Enable; //允许计数//用SysTick做的一个定时器。" ?& f1 ~& B) m- @
   TimingDelayBuffer = 1000;
  a* r9 M2 t6 E9 |/ i  q# P. o: ~0 M! p
   while (!(USART1->SR & USART_FLAG_RXNE)), X- G9 Z1 O$ p9 J$ l/ o% a
   {
. z3 J6 s) N5 a* d5 o     if (TimingDelayBuffer == 0) //定时一秒没有数据就退出- g6 r/ Z+ u9 k* N
     {
! `( g$ J5 Y( e$ \& A      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt 8 f4 O* ~9 Z  U+ A$ H6 v$ M
      return;& C! M1 ]3 u# z. e$ A6 N  M
     }7 E  M8 n/ u; h4 M9 g+ u9 T
     
# E5 N( Y4 {, O% q) [   }
2 c( D, U. \& I   
$ R( J4 I# k# T3 I  f* @7 r   SysTick->CTRL &= SysTick_Counter_Disable; //禁止计数
& t! v* B' e0 K# E+ V     SysTick->VAL = SysTick_Counter_Clear; //计数器清0
2 f4 z8 |" ?5 `6 d$ _9 J     
9 Q8 |( B; e# z5 \: R. h1 ]       RxBuffer[RxCounter] = ((int)(USART1->DR & 0x1FF));/ c! B6 F. p- M; t
       USART1->SR &= ~USART_FLAG_RXNE;  // clear interrupt flag1 K- V! T, x" L
      
% x" k5 {1 L( T0 i8 M! E6 P4 [' \   if (RxBuffer[RxCounter] == 0xFD)
2 J8 ^1 b# p* l( t$ d/ D   {
* P( B% C! |5 C+ D+ D8 f    RxdDisposeFlag = 1;
: Y6 a0 R6 A' F    return;& J! x* F3 m' o$ C8 j6 ^, B7 C
   }) H3 N: r& x( F5 Q8 `" _  ~# ?
   & \& }' {1 g$ Z* d: K! l* d' {
   RxCounter++;
( ]- r9 l+ n3 _  x  }( L  F( ^: s3 P
  * Y1 \0 M# \5 y7 k
      USART1->CR1 |= USART_FLAG_RXNE;           //Eneble the USART Receive interrupt % m7 t5 ^8 M: O7 w6 e3 x
     }
- t. I2 i: }. P9 E8 b7 R}
7 p5 K5 a1 u$ M7 {

  p. Y. f$ p! g& q! Q6 s8 H- ]

该用户从未签到

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)1 U9 A7 T" d$ x; `
{( B) N( L) |/ M( \4 b
        unsigned char temp=0;
! M" W  a  v7 A) u  i        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
% O( n( F! j1 w7 N2 S* t        {
* m6 K  C2 A5 |. [; d( ^                temp=(unsigned char)USART_ReceiveData(USART1);
2 \; n! G: F' K5 o) O% ^                if(RxBuf1CNT<SERIAL_BUFF_SIZE)
! O) v& G; |- Z! ]                {
; I4 o4 R9 }: F                        RxBuf1[RxBuf1CNT++]=temp;
+ C5 q. _9 {5 s; }) t                }( P9 \8 O6 M5 I- \2 B2 A
                else
# J# s* {: j1 }( t! w                {# @6 G7 J8 n; i# q
                        RxBuf1CNT=0;( ]) `% }' h: l$ `2 i! O+ a
                }
5 E- \# B, m+ `! \3 f/ ?8 r        }
2 o- Q* y2 U. [/ u+ E7 N: |4 ]/ d9 b}5 {+ z$ K* T2 N; s
我是这么用的,可以正常使用,是不是你的USART初始化有问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-21 22:23 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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