串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
/ i6 v5 N5 Z/ t V( N
- x- H3 t2 o+ `# x- M一.物理层) X+ \6 s7 S6 g' i2 O1 r) y( R
1.标准
/ G4 m. \6 c% |% `1 ?# R( d9 t根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进
4 l- o7 Z# B- ?( E, r行转换。
3 c' w/ X5 }9 j( A9 m
: t, B |3 `9 b8 ^
]( V7 L* T( m% `9 C2 ]3 g3 `) y: n
7 s8 @7 m( O5 B& H( G, Y
1 O* T D" e9 O& ^7 {+ O2.波特率
, {! t1 C/ ], t* t; b; H* j$ r" ~串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
' x4 R- I- I2 ?" S- K) |: U6 z% n0 }3 z% ^9 v Q1 ~ T4 B5 X
3.引脚
1 D' k: H/ q$ n q! @TX:发送数据输出引脚。! f$ y5 M: e3 r: j3 c
RX:接收数据输入引脚。
6 G6 k( ]. w4 a G2 U# S( I(与单片机相连接时,TX----RX,RX------TX)
9 b: n, h* }% A1 h* _9 @; m6 g' ^) J# p6 R8 V5 Q
3 R0 ` }& _" u& c/ }9 Y# I二.代码层6 @+ \8 \5 M- K' E' v
- HAL_UART_Transmit();串口发送数据,使用超时管理机制 / {7 h! x/ f4 \# r
- HAL_UART_Receive();串口接收数据,使用超时管理机制3 l$ N7 \9 o, Y: m6 O5 ~, l
- HAL_UART_Transmit_IT();串口中断模式发送 - Z! w/ L% N! W4 y1 {
- HAL_UART_Receive_IT();串口中断模式接收0 _, Q$ m! _6 o2 D/ x
- HAL_UART_Transmit_DMA();串口DMA模式发送
9 z6 R; |+ |+ v0 \3 S3 s9 m- M8 V3 W - HAL_UART_Transmit_DMA();串口DMA模式接收
4 X2 f0 g9 |( ^% l
复制代码 ( X( W9 t$ K6 N5 f/ I2 O
1.发送函数
: l$ ]" C: F1 M& W: M- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
7 S& N7 u' j) n# B+ N5 Q# V. b
复制代码 7 S9 F9 B. Y7 o/ [
* N& i+ d* h' s3 `" r
7 o4 H, m( q* ?2 M. T5 |) P
这里图片引自Z小旋博主的文章
7 Y, k4 _; X/ _4 L2 ?
( m5 L2 F% C' a# b
+ b; i; v) O7 {1 f8 O2.中断接收
/ A, [+ r. d! N# S# l ?" p" g- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)9 D5 ?; y6 V: I+ _; t- `, R P' e
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
# Z$ r" ^) u% ], m8 z- i
复制代码 , m4 G1 Y& a7 V3 p7 V+ F
3.回调函数. q3 J0 h5 c* N0 \8 B! }
- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 4 ?* v3 T6 N" G+ w' o" j! P4 |5 [
复制代码
# \& X3 y% y) c& M! M3 E' B }/ w- g在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中: _. _ ~2 d* Z1 T
/ J. ^! [7 @: m( c- G/ v
4.重定义; j8 }( j' g0 @" o% t7 ]
在代码中可直接使用printf打印数据来检测数据6 I- f. b( p7 q4 R0 G
- /**
5 k4 p& R. ?) g, C - * 函数功能: 重定向c库函数printf到DEBUG_USARTx, |$ `7 s. z n3 S. p! r8 w( t1 F7 \
- * 输入参数: 无
- j4 J* b3 R6 j% E - * 返 回 值: 无7 j1 k( k7 [+ ?
- * 说 明:无6 X" w! e6 a( `$ S
- */# u: X5 h3 c9 _! H) g* `) L
- int fputc(int ch, FILE *f)
8 E9 h! m2 e" x! J+ n$ ~ - {
" k) {* ~; G8 X) d- i - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
) ?8 e8 W1 p( }* w0 `; w4 p7 w - return ch;
* C5 l+ W# l ~1 p - }
0 v, w' D d/ v. P& C- G) W. p- Q -
% ~: V2 T/ F( {/ z. F, w: `/ l0 a/ ~ - /**
6 Q5 M0 D% u! B - * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
/ F0 I6 z, k2 M5 d7 Z: C - * 输入参数: 无9 ]& h9 z5 G. d$ \* f/ k/ ]* ~) z% F
- * 返 回 值: 无
2 k0 a( t& X7 Q - * 说 明:无
! ?' i9 b Y! p, ~) v - */
' h' x+ |7 x4 V) x5 `; w+ G# z! T - int fgetc(FILE *f)
1 f4 u8 r% f# R/ `$ W - {
0 n! r0 @5 d' J6 N - uint8_t ch = 0; |2 i5 t; _/ @7 k. V& e7 b
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);5 d0 }7 A3 M( D
- return ch;+ G2 O% Q! I" Z0 q$ ?; H
- }1 @7 K4 I) p3 g7 p8 ?7 A
复制代码
* D; H9 ~# I1 X! v0 _% d5.上位机8 ?$ @5 B: V7 w' [1 H
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应- ?) C6 X3 _* N1 i$ S) J, y
- g! n9 S1 ~2 v* T5 w. S% _3 w
6.串口中断
& |& _0 c9 k. O6 _5 }( Z! @% d在cubemx中配置好中断之后,声明4 D. y% b; K- F3 l. }+ ?+ n
HAL_UART_Receive_IT(&huart1,usart1_rx,6);$ v3 \! k' _( d; v
在main函数下添加回调函数
8 d& t) E4 L' F/ K4 J* y- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)* w% M8 W9 ^2 Z/ x1 r" H4 V. r# n
- {! D/ F9 y3 z! B+ M
- if(huart->Instance == USART1) // 判断是由哪个串口触发的中断7 O6 c- I6 T, M* `% ]( K, ?- w
- {9 U4 o5 Z1 @ T9 Z, z. d6 P) H
- HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长
4 g2 u* V6 \4 F' r% A - HAL_UART_Receive_IT(&huart1,usart1_rx,6);7 K5 \1 k2 f) s& ?9 b
- }% m% V) ^( J$ f9 F3 K
- }& k8 E& b- [6 W+ q" b9 H" A! [
复制代码 * {. |9 i6 f, o' ? `' y4 a
串口打印8 q, U Y" j/ g! |0 r
: U& J* o1 g/ p2 I+ H
* M( |4 H P! q$ E$ V2 ^! s9 h" m9 l# L# t9 P; O) u2 q
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
. L H- j8 r# J———————————————— R! }" v I1 i3 y
版权声明:地球先生_
# f. T8 n- U/ n" w如有侵权请联系删除# N& m% A) b: B' i* W6 z# X
1 m3 l! Z1 ?) d/ Z* I3 D% ?
: F# b' ]" d" o+ T
2 p. ` y/ b, O$ e; z |