本代码 基于楼主上一贴发表 帖子构建的工程:https://www.stmcu.org.cn/module/forum/thread-598980-1-1.html
3 q+ s/ h: A+ L$ I, j
4 k. f7 ?* v1 {: P[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]
* j* X7 k2 n& h2 b$ x5 D5 p0 x4 S: s" {+ y. U
添加了一个 os_usart.c的 文件
6 q- @' }/ x c: `: [5 o内容# T5 G8 n* y2 \+ P
+ T9 | l8 C- \( R& L3 h
如下
2 x* V3 x1 Y* ~4 f! e* T
% I" i# r1 S$ S: o9 Q- L- #include "stm32f0xx_hal.h"
& B( N, x3 q+ k0 ~( a2 N - #include "cmsis_os.h"3 g2 e' T2 u5 O1 b( @: L
- #include "stdio.h"' E, x3 n* O3 z: Z4 G0 Q
- 5 F# [7 f5 D h4 ^
- extern UART_HandleTypeDef huart2;
# V# \; {9 p* F2 z4 m4 m* ^4 ^ - osSemaphoreId usart_sem;$ S Q# Z( j7 {# a
- #define Buffersize 10% i- v' `* e( r8 P& X
- struct usart_buf_t! }; t, w" ]$ k0 [2 I! q
- {0 B, a% V/ u+ G. L( Y4 A
- char buffer[Buffersize];5 N9 E1 R" d2 F7 n3 }; z* a' F$ C2 s
- int rx_index;
+ l, c& b! Y$ A5 M - int save_index;
M: z; N4 \' I' T, l - ( y7 D4 g; A- N, L( ~5 u7 V
- }usart_buf;0 n7 e) S- @% _4 W$ e3 q3 y) G
- void os_usart_init()
+ y. S# C. U& d& r - {
+ z& ?3 x3 b& J; d2 ^$ M% ] - usart_sem =osSemaphoreCreate(0,1);
6 y" j4 Z% M! c+ b/ z; j - usart_buf.rx_index=0;
- i% m6 g9 Y5 ]' w9 H; [ R - usart_buf.save_index=0;5 } {4 R$ o7 y' S9 a- t
- osSemaphoreWait(usart_sem,osWaitForever);3 |# d! W$ D2 x; ]! f
-
/ e! `& y. r4 N - HAL_NVIC_SetPriority(USART2_IRQn, 0, 1);0 U9 S0 l& w8 Y- S; o
- HAL_NVIC_EnableIRQ(USART2_IRQn);& U% O2 Z3 `3 d9 S/ r* u
- __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
. [/ ~8 C1 f5 a+ r4 A7 I - }" w8 j/ `7 E% A4 J" O- `6 [
- 1 [ ?( p. l6 t) _$ G; v5 N% Q
- void USART2_IRQHandler() a! S. {- l1 E
- {
+ X F+ @4 E9 d9 v3 \3 ^0 z - if((__HAL_UART_GET_IT(&huart2, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) != RESET))! J3 c- D6 N* I6 O# g/ o+ H h
- { . ~6 E/ ~- u9 d% d& u9 [6 v
# b& ^, N y0 I' Z( ]5 q* `0 w- usart_buf.buffer[usart_buf.rx_index++]=huart2.Instance->RDR;
/ u2 v" n: K- d# o1 S2 A5 J - if(usart_buf.rx_index==Buffersize)usart_buf.rx_index=0;
) ~0 \$ o0 T0 ~- ~3 f2 \: _& e - if(usart_buf.rx_index==usart_buf.save_index)
7 r. {# {& n0 O6 M" I5 t - {9 d( Q* k! T4 S |
- usart_buf.save_index++;, Y* W/ |% D+ `4 X8 s8 S3 [
- if(usart_buf.save_index==Buffersize)usart_buf.save_index=0;' U% s9 _' V: L" |
- }" ]. F& ^0 H& l3 N: i, l/ Z
- osSemaphoreRelease(usart_sem);: I2 C2 Z7 K3 `6 X6 q
- /* Clear RXNE interrupt flag */" J! \* x2 }( n. _
- __HAL_UART_SEND_REQ(&huart2, UART_RXDATA_FLUSH_REQUEST);
$ t9 f( H; u, X6 @2 E6 [, ^9 j$ B& V - }) i9 I# p$ P3 _" U; D6 ]
- }
6 i, m' L3 F5 A6 g3 n: p* P - static unsigned int usart_timeout=osWaitForever;7 D8 A$ M( X) s9 u0 J
- void Set_usart_timeout(int timeout)3 D, ]) K* `# B
- {
1 V* ^) D" n H# l" P. R$ f - usart_timeout=timeout;
& @/ v8 G, H' J' p( A+ k W! F - }
! p Z, `8 Y/ O! V/ [* s9 i - # m- U5 V9 H6 i0 J
- int fgetc(FILE*f): ~ N: X1 p6 B: ^
- {% w% t% N5 }8 w( n7 P" T: B+ [+ X
- int ch;) c1 q2 P* o! M2 }) j
- if(usart_buf.rx_index!=usart_buf.save_index). N2 Y# g$ U4 ]7 E" I" B7 V
- {
N5 y. N" Y- e0 E4 @7 Z. | - ch=usart_buf.buffer[usart_buf.save_index++];
# J/ e7 g& ?+ O# g - if(usart_buf.save_index==Buffersize)
: G- b7 i+ S( O8 Q - {
1 M4 ~: r# F: k/ K$ x' o, ]; B6 Y2 T - usart_buf.save_index=0;7 i% Y( k0 G! z Y/ ]9 F; I
- }+ h, ]$ _2 V8 N0 {" V+ f
- return ch;
" `% G0 d' {% ^% t' S, V/ ?. v - }
& ~$ p( y4 ?) P' x" r( @0 M - else
- U- @9 V/ U9 M/ S$ q$ D# a - {# U4 N0 ~- u3 Y/ A
- if(osSemaphoreWait(usart_sem,usart_timeout)==osOK)
: H( Z# o! f- \7 h$ i+ e - {
% V( K: R9 D- I0 Q. A - return fgetc(f);
9 q0 O! ~8 n) u - }
2 ^) y( V+ D8 T" c% ]' v% Y - else& w, O, n2 c# T
- {
$ O0 L: v5 e! {( [/ Q6 d - return 0;
% O4 v/ C2 [8 r( H2 P; r9 e9 d9 F" M - }* g" O; y. p1 ]5 m) z
- }
# G3 q- x4 _: K1 T$ Y& @# N - }
p1 D( a/ ^; w% B2 D, e" x& F - ; A3 E J# i8 [9 d5 ~5 t- L
- int fputc(int ch,FILE*f)
; S* n* ]" U9 ~# c. i: C - {
. N+ s w' ^$ P$ x: d* @' V - while(!(huart2.Instance->ISR&UART_FLAG_TXE));
; h* |1 J5 ]9 \. a/ [ - huart2.Instance->TDR=ch;
+ F' _) U9 U( R- t# P/ s - }
复制代码- ( C1 X' e0 ?5 g; s6 P( r0 b
复制代码 1 |3 Q# p8 P, d/ |+ d
下面是主函数 增加内容 8 @8 x; q: K4 t9 x$ a
# m+ l9 a T' J5 ]5 t/ ]
作用为 通过scanf 扫描串口 数据到 i
, u" g! N# X- g$ Z0 W* Q. y; Z+ m2 I, ~# C
将收到数据 以0x-- 16进制 打印4 | l4 R8 M( K# `+ V
! b; o1 c& I, b2 M' T
使用 超级终端 运行程序 键盘输入 10 Enter 可见超级中端 输出0xa
. ?/ V, ?* T- ]+ P
4 |$ M( b5 w# ~$ X; o; M" w; T h; P5 R) V
8 e! V7 d6 _2 z$ f
+ Y: z: j6 e9 u3 o
- s$ e" [8 d4 P* H- W5 w* D) Sscanf阻塞 程序运行的过程中 仍然看见 072 LED闪烁- C; @" d! B- D- k# M0 A! p! A
' _ T' |* ^6 F
如此可见 使用OS 接收串口比 没有OS的优势~~; m( h6 M- w7 v8 F
6 q$ Z5 Q$ _0 I- T- x! u例如 用这种方式操作 GSM模块 printf("AT+XX");8 [) W% R* `' o* @/ ^! k
发送 AT指令之后 ) P6 E" K1 z$ N. I/ f6 j2 ~
# v: j/ h. p1 j) s: Q
用scanf 接收模块回复 + B# J) b& C0 p& Z! ]& a
# D6 u7 k/ Y' ], s1 ? l' Y. i在此过程中 你的设备仍然可以通过其他线程 响应 按键或者 更新屏幕 显示~~
4 F7 O0 y( m! M6 z+ r5 ]4 ]% V# L" M# ?- j" c
|
不知道 你有没有研究过 HAL 的 中断 API , e1 Y6 j! E8 V5 u. P. a
运行机制是这样的 设置buffer地址和 需要接收的 数据 数量(这个是重点)!9 D; t6 C9 j: G+ X3 ^' K
4 u) b' \( _5 W2 R
然后会从 串口发送一个字节出去 HAL称之为 DUMMY_DATA 这不是 所希望的吧?
然后 需要所设置的 数量 数据接收完毕 才运行 callback函数 显然 通信过程中不知道需要接收多少字节?+ ?, z' C' [- S! ~. B
总不能设置为1吧? 那HAL又相对于 自己写个中断函数 又显得臃肿了 很多~~
HAL 库的 中断接收 是 主动调用的 * M( @3 ^5 C1 u {/ G4 k
也就是主动接收
" G1 ? \8 b/ ~& J7 o$ c1 R8 J
我这里需要被动接收的
上一贴的 地址在 帖子 顶端呀
不太懂,估计楼主也是个小白。