用过HAL库的坛友想必对串口接收中断函数/ D- @8 [( Q* \% f7 R. [- |
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
& k$ \/ u; Z% y7 M5 K中的 参数 uint16_t Size 深恶痛绝,我看到这个函数心里就在想,我又不知道我可能接收到多少数目的字符串,这个参数怎么给,因此通常情况下,我都是用的阻塞接收函数 R8 D$ ?; O7 l9 D9 l1 N7 Y
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);$ R9 O3 {5 l' F) ~, E7 m4 ^+ p
: ]* V7 p4 c) c* ~
最近想到一种思路(借鉴原子的思路),不仅可以使用串口接收中断函数,还可以通过结尾为 0x0d 0x0a(即回车换行)判断接收结束
) |& @. {/ H7 _: m, o每次中断接收一个字符,6 {+ r- I& i% R
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
* c, r1 O8 s) O u - {
0 L+ o' U1 X! d# P7 c' \ - if(huart == &huart6)
! [+ p* g2 W. [; M - {
4 B9 ]+ {4 r' L( U! E - if((USART_RX_STA&0x8000)==0)//接收未完成
, ]- u# x/ _" g8 V - {
0 L/ {( l2 q4 k- m# [$ F% }+ ^ - if(USART_RX_STA&0x4000)//接收到0x0d+ n# B9 k% y2 G
- {
- c6 P ? z9 Q8 l - if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
& S2 X2 Z& O- t/ ^ - else
2 s6 A* ~5 X, z: G2 S1 u9 N - {
: V: R! J0 w& A. c$ g - USART_RX_STA|=0x8000; //接收完成7 X' C# p+ Q; Z% p* y0 ~( d U2 t
- }
4 {# c4 J0 E; X0 }- _& W# E r - }1 [& h0 t# l6 h' ^: J2 R
- else //还没收到0x0d
/ c8 _0 z& i1 d) y* A# F - {
2 c0 ]# B% m# F8 h Y - if(cc2541_rx_at_buff[USART_RX_STA & 0x3FFF]==0x0d)* l B, v7 g: I2 f; {$ n3 W
- {
# @+ L8 l8 p' ~0 c - USART_RX_STA|=0x4000;
4 b. Y9 y/ h5 x4 e8 B) j+ \' j3 | - USART_RX_STA++;
5 P+ w2 E- d; J. k3 s3 B+ I5 R& b - HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);# y6 v9 i8 j! h8 L
- }% U, o0 Q3 y4 L" O
- else
1 E8 O6 V) u/ ^& I - {+ b$ M6 S! J9 j2 i2 r+ d
- USART_RX_STA++;
5 T' A/ \7 [- g2 t9 y+ ~ - if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始
' ^, a1 O9 {5 l - HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[USART_RX_STA & 0x3FFF],1);
4 y i9 A; z/ B1 v2 C% N3 y - }
/ k3 N% R! @* Q6 \+ [9 f9 m0 K5 J - }
* f0 `+ E" v3 F" p - }
9 D; R+ l- o& Q4 c - }
{. a6 n& n0 [. \* i - }
复制代码 其中
% c# w7 E! D( l9 F i- uint8_t cc2541_rx_at_buff[USART_REC_LEN];" l; F0 N+ Q* d$ n
- //接收状态
/ f4 L, G; L/ k! ~ - //bit15 接收完成标志4 X6 q: q b7 A4 C) q
- //bit14 接收到0x0d$ n7 n0 |6 V0 ?1 x
- //bit13 接收到有效字节数目3 l* ~* F: p7 w0 @: y1 r
- uint16_t USART_RX_STA=0; //接收状态标记
复制代码- #define USART_REC_LEN 200 //定义最大接收字节数
复制代码 在主函数里面,就可以这样写
' f8 R C& b/ D x6 Z) _- R- HAL_UART_Receive_IT(&huart6,&cc2541_rx_at_buff[0],1);. Y6 {! U' `9 E. ?5 q; N$ ^
- while( (USART_RX_STA & 0x8000) == 0);
: ^ T5 B2 `# L+ C - //
8 O& g( `2 K; V) ~ - 自己的代码6 J' q: C9 U# l9 @0 e
- //9 a6 S! h& O% Q! i% @$ a9 C* v, m
- uint8_t i=0;* H9 ]) l' \5 L
- for(i=0;i< (USART_RX_STA & 0x3FFF); i++)' V- @* A/ U0 |
- cc2541_rx_at_buff[i] = '\0';
y& u5 n( J( I# H% ^) y - USART_RX_STA = 0;
复制代码
% w: T% ~- v& W; S9 o
( ~( d$ A: ^# b' B" L' x% j# O |
是的,但这里可以一次性接收最多为200字节的字符串,以 0x0d 0x0a 结束,这样就可以不用知道要接收多少个字节了
楼主主函数那段代码应该是放在while(1)里面吧,所以不用加
什么叫一个字节式的接收啊
HAL_UART_Receive_IT,它的中断接受,你设置的是每次中断接收一个字节,不是啊?
需要接收到数据就马上进行处理的话可以修改it.c里的串口中断irqhandler
嗯,自己的思想+库函数就是创新!