|
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
|
|