本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html3 q1 K- D. [5 M% H
|- {! t9 g, A( w1 Y
[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]
u% z0 L$ g5 I2 b5 z3 s
, k1 l% [; N2 Y: m( }1 r& @3 K3 U1 n添加了一个 os_usart.c的 文件
+ \% h. _& e9 d* V$ @+ o内容- ?" w8 S% v) {2 o% [6 Y
5 E* n2 k% L7 ~如下- % J( |/ l) ^2 j
- $ J1 w) b2 Q2 `- T% z/ ~9 ]; W
- #include "stm32f0xx_hal.h"
5 r% O8 r3 Y, i) @ M - #include "cmsis_os.h"
8 M( U2 P5 `: m% W( w- c - #include "stdio.h"9 N% K' t9 Z& C3 Y$ d$ B6 e
6 g/ Z$ V1 A4 j8 Y* P: @ S$ s+ e- extern UART_HandleTypeDef huart2;4 y5 d, Q# U5 W6 k6 J) e5 c
- osSemaphoreId usart_sem;
2 F* I% m/ f' Y, H7 I' V - #define Buffersize 108 G% d- C# ^# e
- struct usart_buf_t$ Y5 z/ h& [& Z F3 G
- {( J5 ?5 y1 k; s- a& x$ U
- char buffer[Buffersize]; {+ h5 |* r |% A8 s# e3 f9 T
- int rx_index;8 v- q1 O; S( a& k2 }* `8 _8 c
- int save_index;1 L) @. Z/ v+ R0 l5 [
- 7 ?0 I' n$ |8 P6 e2 R
- }usart_buf;
: Y) v' L7 I3 l0 c# G, o$ O8 g/ B - void os_usart_init()
+ y# p4 k& c5 `+ ~2 B* B* T - {
6 ?0 o# T+ h4 Z+ h! e, J! a6 W6 g - usart_sem =osSemaphoreCreate(0,1);5 @$ B7 }7 t# Q8 m) A0 E
- usart_buf.rx_index=0;$ x4 |$ H9 N' ~& \7 G D4 K4 e
- usart_buf.save_index=0;
& Y. J! ?# v% m/ X - osSemaphoreWait(usart_sem,osWaitForever);4 n U' z4 \+ N$ M/ U& g* ?+ l
-
. F; N4 @& H' R1 `8 g - HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);
) ?$ E- l) c$ `( m! q$ {7 l. U - HAL_NVIC_EnableIRQ(USART2_IRQn);
# `3 L$ F) }& N: e+ Z) N* o1 s - __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
* ~' m# q7 D2 q* ]8 w, s0 ]% t - }5 ?2 S/ E0 V6 Q: U
" ?6 n* {: m, _. {- u- void USART2_IRQHandler()8 a0 _5 ]5 I: F9 a+ ^/ A3 K4 A4 o
- {
% r1 v# E% _# z) E3 K. r& t - if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))& M" j0 n# y- q! o
- {
' Q- @$ L- i$ x$ _7 g! A
0 h3 {: I. b" a( U- usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;8 y* C- f4 ]' F6 j
- if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;, h2 }1 X; J; w
- if(usart_buf.rx_index==usart_buf.save_index)- r6 P) @ I+ S) \" J- ~1 O
- {
- O$ y, P; J0 W$ Z Z" F - usart_buf.save_index++;
# ^9 e% ]( B1 b3 {/ E. K, _* b - if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;/ j! Q% p; a: z1 M+ h
- }
2 r4 Q/ E9 h( Z0 H) H$ m2 z; x+ n - osSemaphoreRelease(usart_sem);% F5 j: u8 H5 G4 O' G$ t0 F
- /* Clear RXNE interrupt flag */4 f8 @% w' C6 |8 H( d# ?
- __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);1 K& w! D" l2 ~# J
- }6 U1 k. E9 \6 o, X) A6 h" z
- }; x3 X$ U, k: q
- static unsigned int usart_timeout=osWaitForever;& E( \% L! j, N" a+ f3 u
- void Set_usart_timeout(int timeout)/ O" u. C( W+ \# h6 |. s" H
- {
) [# \% V2 W& ?& E9 \3 |8 s2 N U - usart_timeout=timeout;
0 I$ S. ^3 E2 L - }
% n0 X7 e1 k5 c, Q
& U* W; ]6 l, D/ X' c- int fgetc(FILE*f)
D. `8 S! b3 c9 H - {5 Z( h& ~3 B2 J' \1 ~8 n
- int ch;
; V1 p7 R8 o% |. B% P# F @ - if(usart_buf.rx_index!=usart_buf.save_index), z# [' |0 ]8 u1 P7 R. _0 z; ]
- {
0 ?1 w s: j( H, V8 i) l - ch=usart_buf.buffer[usart_buf.save_index++];
6 d% ]) g2 r# l& i - if(usart_buf.save_index==Buffersize)
7 g' a8 ~) `9 i8 x - {
& x" I6 a* a! k% ~' t$ O6 ? - usart_buf.save_index=0;
" J$ X" O# ~3 Z! q1 i - }, Z7 Q1 Q7 `6 s0 h: Q- i
- return ch;# d6 o* S3 ~3 I$ X" T
- }
0 c5 r/ p3 Q+ I - else
4 a- r2 G- f1 _ - {
8 b4 a* ~: s& N2 _$ O - if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)4 |' j; V3 e) U F! n; [% x
- {
% J, H8 N. N3 D$ B9 U - return fgetc(f);
5 ]; g: f: G/ i* ` - }% ^4 |8 E2 q \7 }- ?; \
- else, U; E; z- @% |" }! ^
- { ]* b4 z# \5 a% p/ J
- return 0;
* X( V- t& @; g$ O& ~ C! g - }. x. V, I0 G" Q
- }
# G# V) ^1 T2 x8 i* {0 c - }# D: S- P; Y4 ^+ o1 s2 N& d
- & ]( S* S) g$ s D
- int fputc(int ch,FILE*f)! x8 v& U0 F: B: x5 g t
- {
# W1 x; `: F) U& ?! P: l: Y - while(!(huart2.Instance->ISR&UART_FLAG_TXE));& Z2 @; `/ _& U
- huart2.Instance->TDR=ch;# c! m0 z) F, y5 u( Y+ [7 W# _+ T
- }
复制代码 5 X# }' |# C5 D- L- C6 Z
下面是主函数 增加内容
7 T: h+ m6 v- U; s& E4 U
9 R- z5 z8 s4 g6 c作用为 通过scanf 扫描串口 数据到 i / d4 \5 j# [; d
9 b$ E8 ^. r" L9 \7 s( f8 d2 R1 Y将收到数据 以0x-- 16进制 打印
3 V9 p/ h' I7 D' H2 p. r
- p: a7 k ~, u1 s, h* Y- l使用 超级终端 运行程序 键盘输入 10 Enter 可见超级中端 输出0xa
& W" A* h3 }. X7 G1 F* q( u! M& I b: i. f+ p0 Z2 e! O+ U( J. C
% E' M, A1 c$ a& {4 L
$ T7 e) u# l" O, W% R' j5 M0 [
9 O+ r% K' p$ m; f
, i6 T* _6 ^4 w% q' {2 Xscanf阻塞 程序运行的过程中 仍然看见 072 LED闪烁
9 h: G% R. ]& U. ^# j2 N4 B8 L1 d" p# J" H
如此可见 使用OS 接收串口比 没有OS的优势~~( c, c& p! Q: t9 i! G6 U4 p
- j% I/ p! @( l' r
例如 用这种方式操作 GSM模块 printf("AT+XX");5 V% T. y0 V% q9 ]2 |2 q* W3 h
发送 AT指令之后
! r) A! C" j( {4 \- {/ A4 s
) @# t) X0 X* l用scanf 接收模块回复 0 D2 Q8 Q) y0 A- Y; |
: N. |! v4 M" X) K5 Y8 Z: H在此过程中 你的设备仍然可以通过其他线程 响应 按键或者 更新屏幕 显示~~, S7 d$ s/ F, u- v
" U! U' Y n6 L0 G- i( R
|
不知道 你有没有研究过 HAL 的 中断 API 4 S, B! b6 z0 o) f
8 m: A2 w' y' t% S
运行机制是这样的 设置buffer地址和 需要接收的 数据 数量(这个是重点)!. `8 E @9 ]' I3 S: o" n
然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
然后 需要所设置的 数量 数据接收完毕 才运行 callback函数 显然 通信过程中不知道需要接收多少字节?
$ U s4 _' C, M; K7 ?
总不能设置为1吧? 那HAL又相对于 自己写个中断函数 又显得臃肿了 很多~~
HAL 库的 中断接收 是 主动调用的 / S1 m* F4 ~! W/ ?, B
4 ^+ Q/ U P. Q4 p4 c M) U
也就是主动接收
/ Z) ]# x K' B# K6 b1 v3 V( F( B
我这里需要被动接收的
上一贴的 地址在 帖子 顶端呀
不太懂,估计楼主也是个小白。