一、定长接收---采用, p) J) E; D3 {; \
A M8 d3 z' u8 `1 k3 o, L1 z4 w二、以特定的符号作为结束符
7 I1 J% D2 P) ?
! ~7 N3 Y; ]" _7 `: d$ k' a/ ~问题:①单个字符接收②转义字符- H9 V4 T+ J0 K6 o. z0 G% [3 g# d! l* s
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
5 g0 K9 R$ }1 L H# `: x - if(huart->Instance == USART1){, A I4 Q9 @! Y" v6 l# R
- Rx_Flag = 1;
$ X3 H S u0 G+ y V - }
5 f' \1 F7 c4 u - }
$ T# [* _* P! y7 M9 \/ X+ N - ( P# J4 H4 M3 a! f
- void UART_Proc_EOC(){
' Z4 T3 ]6 C2 i - static int trans_state = 0;
* d/ }6 z2 W. t - if(Rx_Flag){) r0 `8 z$ [7 Z/ s5 q% ?0 @9 Z9 m
- Rx_Flag = 0;) d3 o8 h6 A+ j( V0 c
- switch(trans_state){
8 Z" t; y+ ]' d+ ? - case 0:/ {. z( P2 X. |# _8 n% B% X0 n& {" r
- if(RxTemp == TRANS_CHAR)//如果接收到的字符是转义字符
& d& v0 _* Q, k2 b! a; Y - trans_state = 1;//就让其标志为1
4 p' |3 d; z5 y - else if(RxTemp == END_CHAR){//如果接收到的字符是结束符8 R: _$ u& w2 `5 X5 h+ H6 Q) I, G
- Update_Flag = 1;//就意味着本次接收已经结束- v! ` ^; P& I/ r( h; {$ o: k% L ^
- }5 B% Y5 c2 f) C5 c
- else {7 q5 J% D. n0 Z8 J4 K
- RxBuf[RxCount++] = RxTemp;//如果接收到的是数据,就把该字符放到数组里5 |/ U, @, N: [ @# x9 c
- }$ {, j3 E" P$ ?6 u! B
- break;6 z0 x; b" g# N2 @5 I: H8 [) l
- case 1://当接收到的字符是转义字符或者结束字符
! G* T& e2 h5 @; B" @2 G - if(RxTemp != END_CHAR){//是转义字符但不是结束字符
# o9 g% t8 K0 J# Q$ t - RxBuf[RxCount++] = TRANS_CHAR;//此转义字符是数据,要将他写进数组
* Z% C! X( ?" @: B* p2 B* Z - RxBuf[RxCount++] = RxTemp;. Q+ `. d4 W+ ~; h2 [
- }( |' g) ~0 C" e+ w& f3 }& E9 \
- else {& {7 ]+ `$ g7 S8 W+ \' i9 l6 B0 m5 M0 p
- RxBuf[RxCount++] = RxTemp;) m- l8 T7 U* E% v
- trans_state = 0;
8 N; U2 r( j" {) F" m8 W - break;
, O5 M9 A$ ?7 i' c2 K- g9 y Z - }
) ?* a9 R$ R+ O- p, l) E1 | - }" U+ U$ g! ~6 D7 R
- if(Update_Flag == 0){//表明还没有遇到结束字符,仍需要继续接收中断
5 n- l5 K- m7 ^ - HAL_UART_Receive_IT(&huart1, &RxTemp, 1);* S! ]7 m. G3 M
- }
. T$ G; E4 ^% n! ^' c8 M3 u - }
复制代码 7 s- x. ~3 R, w# P3 n$ c
三、采用空闲中断的方式(字符串基本上是连续发送,一旦空闲实践大于某个时间,就认为这串数据接收完了),适用于不定长的接收# g' t6 p1 \) C( h) h* S: j2 W, }
* c. G3 T! M) c) H①常规配置
4 x* y; Z' W4 d) H Z8 a/ n
6 m. T" L/ c8 X0 n e9 u
1 G9 t3 n5 b1 G; K3 A7 U4 z8 j4 ~2 r+ J9 ]& V
②中断的方式
7 F, x5 b3 ~. c1 l# W% k# f4 H' ]: I0 C% W3 n; z
6 `9 C& C( U8 h
: w" A' T4 X) W1 a# l
+ P5 R7 k/ }1 }& J& O 函数中
) H* r* n8 d' ]. t0 N! J! t0 { 在中断模式下接收一定量的数据,直到接收到预期数量的数据或者发生空闲中断4 J. m- z* v/ a7 f# w [: G ~
HAL_UART_ReceiveToIdle_IT(&huart1, (uint8_t *)USART_RxBuf, Rx_Len);//IDLE使用0 L1 Y8 @: |9 D* }7 E8 w0 Y
! D& n$ N7 _, Q! `, F1 [( g* O写上这个函数表明接收端已经开启了空闲中断) F x; K- M, G/ r( J( T
" Z1 {9 h2 l- m& [* h5 M
四、DMA接收,适合接收大量的数据,一般用在报文(协议)的传输,找完整的报文(有格式)
' C% I3 T& d- R# [9 k5 c————————————————7 e" D! }0 t3 E
版权声明:想要优秀点儿
+ r# L3 o2 y0 T8 ?* g% B2 f, P8 v3 c0 F5 z
|