串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。9 `4 V8 S; \& l# b8 r" N% ]
8 V I7 n" n; M$ o! Z! C一.物理层6 h4 X0 l/ j/ l% S4 O' \0 y, K
1.标准. U" N- X) x! R% A5 B8 K6 S
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进
& V1 M4 \& B% N( [# l4 ^; C行转换。6 `4 C, [" }4 a0 n8 N8 x
7 m. s5 P( l4 k( u E
- H1 B$ a" q0 }1 O( ^! O8 j6 Q9 ?: o, X, t- a, ]
2.波特率5 v7 c0 V8 |& ~" s. J. Z
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
1 `9 a/ `' H0 I$ W( [
1 U5 d3 B& a% q4 v9 A3.引脚8 k: K4 \4 Z3 [5 O$ X+ B5 j
TX:发送数据输出引脚。: h9 G- l- y" C
RX:接收数据输入引脚。
1 t' y3 J+ p5 z" A# { i# Z* p4 Y(与单片机相连接时,TX----RX,RX------TX)3 B { z" f# D& x# v
8 c, P* `! Y3 ?7 `
# O, p8 C! ~. n9 H
二.代码层- HAL_UART_Transmit();串口发送数据,使用超时管理机制
1 X2 w9 [; W* @& {: q% o7 @6 b - HAL_UART_Receive();串口接收数据,使用超时管理机制$ I! V& s3 D: A! i% _
- HAL_UART_Transmit_IT();串口中断模式发送 s9 d, N0 R% D& X
- HAL_UART_Receive_IT();串口中断模式接收
2 Q6 X5 L* m$ I$ D* E$ G& M( O7 ? - HAL_UART_Transmit_DMA();串口DMA模式发送0 A# U1 N) g2 _! R) o
- HAL_UART_Transmit_DMA();串口DMA模式接收
0 e7 h: X9 l6 m* ~/ h/ t
复制代码
$ E, Z0 Z }% f% X! i4 r1.发送函数
: y) N" k! B2 N1 h6 S7 m! A- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
复制代码 . j; V6 L+ ~: x9 z/ O$ u- \2 Z$ K$ R
& ]& t( ~) {- n( s( q+ i: _/ h4 m6 ?7 d/ l2 W# s7 \9 I l3 g1 f7 C
这里图片引自Z小旋博主的文章* t9 C" y; ?- i- M! V/ Q
* m; w. |' T7 ]1 U, U! ^5 K- W" A
8 f# p" @! D& c& c; x2.中断接收
* ~% F: P! ?: o- c* I- o# P& L% [$ n- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
7 N4 W7 [! g5 _: q7 `5 _
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
/ x2 V' O& Q) [ p1 g6 y
复制代码 ! q6 ~2 d: v! ?
3.回调函数6 N/ ?+ N7 I9 Q# Z0 l
- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
( j0 [+ }: ?, z l" v8 Q; r
复制代码 2 |9 _# {, o8 u4 R' X' Y. f* q
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中
+ e' Y0 C. K3 E, o; N6 }# _( F) {9 K& ]9 X) g
4.重定义5 u l* p" r0 y% t1 u' `
在代码中可直接使用printf打印数据来检测数据
3 t/ t/ t0 ~" ^- h l- /**$ }2 v% Q0 f: Z9 b5 e
- * 函数功能: 重定向c库函数printf到DEBUG_USARTx, I2 e( G5 v' d
- * 输入参数: 无
4 C1 |/ @' V" s6 T& ~; b - * 返 回 值: 无" ~% Q* F, [* Y; s, w0 O3 C
- * 说 明:无1 W, [2 ?" O% e0 o/ a5 I
- */% X, ?5 r& X- V0 Z4 U
- int fputc(int ch, FILE *f): H; l3 B. A5 ]! c% v& F# p
- {' ^0 K' D0 u5 x) G1 b+ u; A
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
- U, x1 Y0 Y+ O7 u3 J' K - return ch;
! M6 J- F0 u8 o - }. t% m# m. P! O/ i& ^: H* j4 o
- O5 j) s! H9 n4 o- `: I) i s
- /**
% d2 x0 ?$ g4 G, Y$ L - * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx; ^! o' g- g7 M! v0 ` V) B
- * 输入参数: 无
) G! d: r2 K; d - * 返 回 值: 无* E3 s& R9 C2 S5 B/ z9 u
- * 说 明:无2 g& a, ^1 ]1 @0 i+ B* I0 H
- */
7 Y8 \: v. G3 j - int fgetc(FILE *f)
* V" C$ m" t; L - {! U; C6 ?9 F7 G+ B. t
- uint8_t ch = 0;
4 V3 v m. B3 Q - HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
U- r8 G8 [( B" x" y - return ch;
' b! @9 N3 W: _& [0 z/ c# t) O - }! R4 ^- X7 D9 G' p6 H, T# ?; h
复制代码
3 x7 g9 E6 |9 G) u6 q5.上位机2 _6 _% w7 e1 T
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应$ J. ]. ]2 X) f+ l3 Z
# b- u' Q+ z; x/ q' J
6.串口中断
; y0 Y. i& m( I" Q( A/ G在cubemx中配置好中断之后,声明( H; i9 K& B0 W# \6 ]8 W! t& D
HAL_UART_Receive_IT(&huart1,usart1_rx,6);% O! Y; Q! A0 {! N! w, a
在main函数下添加回调函数
5 J c3 E* B' s5 D* c8 c- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) K0 j3 Q+ _( v' p- V: X3 O- z/ c
- {
. I7 l/ r7 V+ r6 R1 w+ L7 D$ ^ - if(huart->Instance == USART1) // 判断是由哪个串口触发的中断) t- l/ @' ?& M) w E
- {! k9 A$ B' p; V( k0 h# H7 p
- HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长
+ R- p8 w E4 T ]5 ^+ Q f! R8 ] - HAL_UART_Receive_IT(&huart1,usart1_rx,6);
- w/ }( T. u, k - }/ U) @, p8 ^& e
- }3 c" ~% Q1 O7 m1 [; G
复制代码 , o6 X; [: x6 F2 c. K
串口打印* C q8 ? u4 d) t; s: |: j6 t; k
5 n$ b* Z! G3 {" K
4 W# ^; _/ }0 D' B. R( q9 ]
; N8 p4 F6 f, _/ B7 k! e6 ]' y
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次6 J; i4 L- ~) [8 p$ R
————————————————
# ]0 N5 V/ G, A1 \5 H$ s' |4 B V版权声明:地球先生_: T/ i' [4 p }* f
4 \ b+ B- Y! e: d
, Q% U; e$ F, W4 o- }( H |