串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
# I/ F5 |; l7 F3 D' ^& m+ q
4 b, [# T' L6 l$ ], l一.物理层
z* L; ?: N; y: B, q' m$ B1.标准7 o" V! V# M4 S! T6 g2 j1 I8 k
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进5 C& Z- r! `8 `8 |2 u
行转换。" F( q G" D. K2 z
* D! X# n; }5 I6 n) A! z1 J H# l9 H
) u5 S. A0 h- q) h0 }2 v/ r, Q
4 D3 F, Q0 K7 ~! D! B' A' ^$ I* y# p2 b! q# I
2.波特率
! q. e: p: d1 m串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
. X* i* H& I1 a Z4 j& n1 [, B7 G4 s, w4 x# H8 t
3.引脚
0 B; h9 ?: ~- q0 f+ H9 J! nTX:发送数据输出引脚。
- ?1 I: i* D$ u4 f5 J0 ~RX:接收数据输入引脚。% d* Y/ r( C. P# l6 n
(与单片机相连接时,TX----RX,RX------TX)' Q9 P, l! T1 e4 S
6 u) y, c3 @, s5 }" I
7 R t0 T$ J7 F$ n9 o g D二.代码层
! T1 x: D+ }- ^+ ^) w- HAL_UART_Transmit();串口发送数据,使用超时管理机制 6 k- V+ {$ D& b% B" q" R5 Y/ z
- HAL_UART_Receive();串口接收数据,使用超时管理机制* @; d$ R. q$ `, i6 \$ e! ~! C
- HAL_UART_Transmit_IT();串口中断模式发送
7 W5 Z7 b$ L. U8 T- H - HAL_UART_Receive_IT();串口中断模式接收) s) ]( _+ O+ k; u
- HAL_UART_Transmit_DMA();串口DMA模式发送
& o6 |( |9 A4 \* t5 j3 A% Z2 z5 ^ - HAL_UART_Transmit_DMA();串口DMA模式接收# r2 w$ C3 |, f* @
复制代码
! Z& J9 p" W% I4 z+ B# v1.发送函数
7 @; ~- C5 f( e' I, @3 q) ]- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)9 c. t! B6 b6 {, _6 R' @9 c2 H* C: h& M
复制代码 / `+ T7 \& \" {/ m
& I0 p; c7 G4 y9 J% r# }5 p( W
& ^% w# k" ?0 A6 k- w
这里图片引自Z小旋博主的文章
$ I, F6 O+ r# q( q6 H: l" e: n3 O' s: X; |( V4 w9 H: v& ^# z
* h6 H) `: w Q* y/ _2.中断接收0 E( ?- R# W" C3 b) ?+ J2 H6 C
- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
4 V: e5 M. G4 _: p6 Q
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
, r, s! B; L- j7 u2 A) q- O3 f( b u! e
复制代码
8 H4 l; |( x3 I" P) E3.回调函数; l4 @2 G" l# X
- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); , x# N: u- P5 N( ~( k2 p; {- T$ T$ s
复制代码 9 c2 \2 j& U. |4 Q
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中. r8 F" {. Z2 E9 R( @! q
, y3 P: V; O6 m- s; T
4.重定义) w) ^# ^0 ^3 F2 ~" [" ~( b% M
在代码中可直接使用printf打印数据来检测数据" F. q( D" D8 }
- /** V' j4 T3 J0 O* L. P/ M
- * 函数功能: 重定向c库函数printf到DEBUG_USARTx( {/ t' s0 v8 p) N: t' T$ F) ^ g
- * 输入参数: 无
$ z; K5 Z; W, A# C1 r1 ~ - * 返 回 值: 无* N$ X; X, u! F; d) x/ C: e
- * 说 明:无' ?2 S( v) g3 |7 g- K# d
- */
0 I# S, B( T8 c' Q - int fputc(int ch, FILE *f)$ w1 @- Z: J; H0 U# [3 L
- {7 _: h4 b5 L7 l0 E5 w
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);, W2 m3 N5 E5 N/ p' r. g
- return ch;
$ g) P3 A2 h& X3 {* S - }
. G& T, u, ~ |' }8 w - % a9 [/ }4 L2 l8 q( z
- /**- J k) F" y& j+ c4 `9 s! f
- * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx$ B9 T' k: K" H& j( }% z/ }* ]
- * 输入参数: 无
/ \! I. L8 y' L; I7 t$ g; f% i - * 返 回 值: 无
' ?, j! b$ [' |" g2 ~$ [' z - * 说 明:无9 j3 P1 }4 g/ C) t6 v1 G9 C. o8 H& T
- */7 j% l' z$ c; o9 K! n# k
- int fgetc(FILE *f)+ ` T1 [/ N3 ~2 u G
- {/ G" _1 W3 d5 ^8 a
- uint8_t ch = 0;& h/ [% Y: W5 V/ M3 ~
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff); l7 |2 t' W0 S2 h5 k% h; `" @! G+ ^; l
- return ch;
. R; o. E* W' o, ~, ^: a - }
, `' o" ?- G: W' e
复制代码
; E3 v6 V f4 A S: ]( T5.上位机
' y3 j ^0 b: @常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应5 \# _( T. b' e) p" v
3 e. c* @) A+ M0 P
6.串口中断
+ ]) [3 y% y- H; q5 i+ d3 I在cubemx中配置好中断之后,声明
& a) y8 X4 P1 d3 hHAL_UART_Receive_IT(&huart1,usart1_rx,6);
, c! U3 B' U+ g3 E在main函数下添加回调函数
6 n; W& Z, ^: Y3 P8 e- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)% S1 ~0 S ?" m
- {
7 |: S: }. t# b4 R: h) p - if(huart->Instance == USART1) // 判断是由哪个串口触发的中断 Q2 ], }- b( l" a7 U* W, c H
- {
7 h( m P8 |' V* L: T6 q1 h } - HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长$ L# S+ ~& ?) d8 g- s; \
- HAL_UART_Receive_IT(&huart1,usart1_rx,6);
4 i- h* ^# `1 Q& K4 Z - }
% J7 P( z; R! M1 x/ r3 h - }
. m/ @. H: H& j7 y5 z) y3 O1 \
复制代码 , n6 w9 }- y+ W2 G* p' x
串口打印
' E; A! g2 X+ k) G V. x- k% V0 E0 B2 @/ H
) L+ \6 _6 F& g4 O
* X- a% A& a0 s7 t" g每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次# s$ z+ Z7 ^2 M4 h8 E
————————————————
2 r+ ]' d7 k0 {$ [版权声明:地球先生_
6 y9 F- r! N; m) N如有侵权请联系删除
: j) y/ B. D7 w: l+ [
& W! d" U7 L8 }# O& V" i% M' b
0 E6 D! ~6 |, H8 u6 v! p g0 ]4 a% a1 L, ^
|