本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html `! Q3 y2 i: p
* m7 J) j; q. n
[url=CUBEMX 简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)]CUBEMX 简单创建 FREERTOS 和RTX 工程,顺便讨论一处代码 https://www.stmcu.org.cn/module/foru ... 980&fromuid=1888292 (出处: 意法半导体STM32/STM8技术社区)[/url]
" [7 B2 M5 \8 W
4 q' S$ H8 q" u& D: {添加了一个 os_usart.c的 文件 1 m& d% x% w/ O7 a, s7 r
内容
2 z ^8 T. k$ ^8 r! a) T4 h! ?) X# W0 B/ B
如下- 5 l r# I9 {! u% O6 m7 \' }. Q' l
( v) h4 o- i/ H7 N3 X A3 k- #include "stm32f0xx_hal.h"
& f% @' X" r: L7 T! a v( w - #include "cmsis_os.h" _! n0 b, p4 z6 n
- #include "stdio.h"
* Y+ s# L' I4 N! q$ r" ?+ O
; L1 o& z9 i# M# n) T, a- extern UART_HandleTypeDef huart2;
) l* [' m( l. j4 p/ ? - osSemaphoreId usart_sem;
: ^8 v/ H {4 k5 y+ x9 ] - #define Buffersize 10
7 w# ?' q5 ^; f, I N - struct usart_buf_t
- m; @, r' U' G; n4 `: K% J - {
C2 o7 J7 e$ g6 } - char buffer[Buffersize];% s& [# y5 r' ~7 v5 X+ c' b
- int rx_index;# Y" A) `4 w0 g2 b q2 s' X
- int save_index;
s1 E1 Z! ~: d! H p - 5 f f/ V6 c$ r, K; K/ S3 ?
- }usart_buf;% W$ l0 W4 ? m- U0 o: F
- void os_usart_init()
. a, b9 V7 w# N! E - {
% N+ E1 M" m" s) W E - usart_sem =osSemaphoreCreate(0,1);4 z1 f# E4 d, ~2 `9 \7 [* a
- usart_buf.rx_index=0;; e5 s( Y4 h! K' w @
- usart_buf.save_index=0;( U3 O( t( I) r0 |1 U o3 C
- osSemaphoreWait(usart_sem,osWaitForever);
3 _& a. a9 J L' f* V - 9 e# r' v1 n, s3 \
- HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);; X! g" {5 f% }- ?; ?) R
- HAL_NVIC_EnableIRQ(USART2_IRQn);+ ?' A0 E- `; S3 f
- __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);8 V; O7 a6 t9 l) D
- }
! `# h, h3 g! M4 f7 n! W) \ - ' @& Q- ~6 U1 j# S( _( [
- void USART2_IRQHandler()
2 n; R6 i& B2 y( S. J2 x - {
X& E8 ^8 y" k! B8 s - if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET)) ~1 t) E! K$ u- \
- {
" ^# h: @9 |4 W' }& M
4 z/ W& l! B6 r- usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;
$ B: T8 ^. i' \ - if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;: P& Y, [8 }, `' J
- if(usart_buf.rx_index==usart_buf.save_index)
& M$ K; H0 M/ v- A* R% a& ? - {* e. G+ m% R0 z7 m
- usart_buf.save_index++;# x' J1 J2 ^4 ^+ b. f/ p4 w f5 i
- if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;
; S, h3 N" R. `9 a2 w - }
" e. K# Z( ~/ z/ J4 f9 Z: D1 | - osSemaphoreRelease(usart_sem);: a7 U8 L+ S7 c" h" b6 C+ o3 p
- /* Clear RXNE interrupt flag */
4 \* \9 D1 x5 i5 {$ x0 w v - __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);
. \. T. z! ]2 y* m& Q) x2 ` - }% B3 _% V; v9 k- W1 ~. c
- }
$ U6 s( i/ K$ X- j5 d6 Z& E5 V - static unsigned int usart_timeout=osWaitForever;9 ~( |, ] y& ] ^
- void Set_usart_timeout(int timeout)
/ L% I1 Q9 r& f0 ]* F' v - {% U5 ?" E9 V: {7 S# ]) W
- usart_timeout=timeout;0 O. s/ q [8 z& V7 Q
- }
8 J I) y3 [4 X. m - . o0 D: ^" ~( f
- int fgetc(FILE*f)4 Y# |, d! b( T3 l. U
- {1 V- ]1 ~+ E0 i
- int ch;; M3 \! R! w; f6 A" k
- if(usart_buf.rx_index!=usart_buf.save_index)& P+ [- J/ @/ u4 o" J, a' _& @4 P' a
- {+ m6 @% o' D, ~1 A7 @8 N) ~( L @5 d
- ch=usart_buf.buffer[usart_buf.save_index++];
% z% p" G O- \/ }# |# _! p - if(usart_buf.save_index==Buffersize) m1 Y1 ~2 g! ]* L
- {8 H( T t5 f( @" s0 u% B
- usart_buf.save_index=0;6 ^5 o8 c4 t# n# G& X% \0 l4 Y' w8 L5 U
- }* J; F! Y6 \% E, _; O9 e: R
- return ch;
# n o: v% }% a7 {- C - }2 {6 ~( ]' b; Y7 v2 y% k
- else
; R5 S& J6 F0 x1 n; |& h5 X7 F. D - {+ v; z7 z5 n+ L" R$ h* O$ Z
- if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)
1 I- l1 X0 u! _3 }9 `# G( K/ Z - {
8 s, j+ ^6 z8 A7 Y5 j: c! | - return fgetc(f);
9 ~- L u4 w% l4 D" x) Z1 C9 n* m - }
' L4 U7 m( m+ k& I; g - else1 j1 R, c' L1 S$ Q+ U
- {2 T. }' N2 M; v" {
- return 0;2 _% s, e1 W2 J1 v$ H
- }
0 b6 L$ t+ o7 J ]3 r2 o - }, e+ Z) r: v5 B; \( o9 x/ e" U
- }; q! S2 k( R" i# h
7 `( d& M; Q; x3 Q% o( a- int fputc(int ch,FILE*f)- \/ n/ O- Y4 P
- {" t9 {' V* H8 p
- while(!(huart2.Instance->ISR&UART_FLAG_TXE));' z7 I: A+ ]( l( q" k
- huart2.Instance->TDR=ch;, c# k6 F1 j. \! ^) c
- }
复制代码 & \) Q) ~( @& y, ^, s. c
下面是主函数 增加内容
* l9 |' j) y9 r, E* R9 P6 [* M/ R0 I" e; n+ I& P9 ^
作用为 通过scanf 扫描串口 数据到 i
6 h z. t% G0 e5 a4 G! S) y
" a; k$ v# s k) z将收到数据 以0x-- 16进制 打印" t3 i( H$ r' Y+ ?5 D* z
) q }5 D, M3 ? q使用 超级终端 运行程序 键盘输入 10 Enter 可见超级中端 输出0xa
( l; e1 h: t- ~. H5 p1 N1 f7 Y9 m8 Y5 W+ Q! Y& Z
% z- |5 B- r& p
; x9 o. J$ |/ p
7 l+ |0 H4 i. U0 H/ T3 |& S% i8 B8 z. l1 k
scanf阻塞 程序运行的过程中 仍然看见 072 LED闪烁
7 a) [" o6 \! j6 w' k* o9 z! H
9 Z+ Z# h& ~" o/ q; T) z, l( U如此可见 使用OS 接收串口比 没有OS的优势~~9 g/ ~1 w. v+ i4 c( G3 b- `
! y7 u( L0 n$ _2 R/ B
例如 用这种方式操作 GSM模块 printf("AT+XX");
- L- e# Z2 W) H发送 AT指令之后
) A+ f, m% K* U2 X9 l K' F5 b! D4 Z5 m' }
用scanf 接收模块回复 ) S5 R+ n/ C8 j9 b
4 C& A9 u* r! I% V在此过程中 你的设备仍然可以通过其他线程 响应 按键或者 更新屏幕 显示~~& A/ D2 |3 Y& f1 z5 T; b" s0 U/ E. n
. f2 e" y+ K: M$ M. q5 l% B c |
不知道 你有没有研究过 HAL 的 中断 API
运行机制是这样的 设置buffer地址和 需要接收的 数据 数量(这个是重点)!! p( k7 x% h5 m- L# `2 A! [/ K, t+ g
然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧? ; h6 }, K7 A! U& I& V! a
8 w/ [) F- k) b& a& x) a+ N3 ]( L. D
然后 需要所设置的 数量 数据接收完毕 才运行 callback函数 显然 通信过程中不知道需要接收多少字节?, E7 [, r6 z* F! E/ ]8 J
总不能设置为1吧? 那HAL又相对于 自己写个中断函数 又显得臃肿了 很多~~
HAL 库的 中断接收 是 主动调用的
$ x: b2 d5 O& ^# A4 R
也就是主动接收 3 M4 w4 P) k3 s
我这里需要被动接收的
我先使用一下HAL API再来讨论啊 还真没用过~~
上一贴的 地址在 帖子 顶端呀
不太懂,估计楼主也是个小白。