串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。0 c* Y! I$ h6 P6 a- k( b: b
# I) p6 ?' n* F$ S3 I5 J e
一.物理层& ?1 d' x, u% n! T( Z, B+ ^
1.标准( I) Q% W y1 k0 s. ~
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进9 `% E4 D" Z! v- J5 F) v5 M
行转换。
, o0 r7 {* ~% ], S9 A/ R- k( V; P9 `3 L; |+ C0 M" D* d
d4 B) i5 e2 Z" I- O0 d0 @
2 P0 x+ d6 g& p" t6 L6 i' ?
- Q; U6 i9 L. g" U1 @6 ~, h' w( e7 @2 g9 U
2.波特率5 Q# U2 S3 L& i& Q9 T
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
; T, A- e# c5 X4 c7 o9 z2 t, @4 t4 n5 J1 [5 P# I# V
3.引脚
1 n4 u$ u9 [. k& n* eTX:发送数据输出引脚。
& f' |8 M$ z* D2 i/ j! P. fRX:接收数据输入引脚。
2 f( K3 S! e3 X c5 @5 Q h7 n2 l4 r(与单片机相连接时,TX----RX,RX------TX)0 H" b4 |2 V; B7 X2 ]4 M
: J+ e$ v K2 s: T5 S
) B( w- J1 o- P7 j0 j7 `7 L二.代码层
9 s1 V5 Z, L2 S# R& h- HAL_UART_Transmit();串口发送数据,使用超时管理机制 " o- K+ M# v$ I' h4 {+ ]' G
- HAL_UART_Receive();串口接收数据,使用超时管理机制
@ k- H% D/ j( v3 _, v8 G! F - HAL_UART_Transmit_IT();串口中断模式发送
; _! c* w- b* X' t* ] - HAL_UART_Receive_IT();串口中断模式接收
8 }4 B$ E" a4 n - HAL_UART_Transmit_DMA();串口DMA模式发送
/ [9 d2 ~9 Q& n+ p - HAL_UART_Transmit_DMA();串口DMA模式接收: p4 {" v4 J1 E4 K1 v
复制代码
0 X# _, H1 w+ e& {. _. p4 v4 A1.发送函数; v( ]) p J, s/ B5 _; \
- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
' ^* v& n- h; F7 ^
复制代码
( _ G/ `$ ]6 l2 S' _3 @$ \
3 ] }: b" r! @* \' S" E( e) m
r, v0 `9 G% n: L0 X5 _这里图片引自Z小旋博主的文章
% }) @% F4 c% j( b5 i
* n" K) f) }: B$ ?8 {6 P1 v( D0 N$ h
6 x0 w5 ^0 `* \2 g4 T. d2.中断接收, M+ c9 r7 R: z( ]( b9 D; r/ X5 N
- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)% t* {' @- [% L/ W! j% u8 G+ u
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
. P! v7 c) j0 K
复制代码
6 n. `0 r! z0 |- D) F3.回调函数
* E8 |4 _3 X: R: q- w: I2 L% Y- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); ' `' ]! c; H8 I) H! ~+ x
复制代码
|! r( P) e9 C5 M在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中
4 e$ n; {! z* u0 J1 x$ V5 |8 h* e2 ]
4.重定义
0 r+ E; c3 E: ?# {0 k. r; n在代码中可直接使用printf打印数据来检测数据" B |, ?# _! P2 ]) @" c6 g
- /**) |, V* _0 n3 U* H) L: h
- * 函数功能: 重定向c库函数printf到DEBUG_USARTx1 n. O% M3 K( m) S! |+ p8 w
- * 输入参数: 无% q* f d- |1 d: O3 z$ L
- * 返 回 值: 无8 n+ p8 o3 X/ ?& h5 b
- * 说 明:无
) d% J& z( N* F. V6 t p9 g; U5 H - */2 \& P' F1 b6 _
- int fputc(int ch, FILE *f)
z+ S) F& D- T& K0 e - {4 B1 T: {8 E( u& [6 W) \
- HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);! [# Q2 F. i0 o6 H+ I
- return ch;" [0 y+ D7 T6 u! W
- }) F. m/ C8 d2 X" |% f
-
* C p( Q% U/ x) N7 ^0 C) z# M _ - /**
* I( r# D, L' B7 R! M! z' n - * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx9 z: C2 h. G$ h# Y. e
- * 输入参数: 无
+ ]* A0 x1 n( k2 B, T8 e! F$ G3 |9 F - * 返 回 值: 无
- z$ y* a$ X4 ~( \ - * 说 明:无/ y& `+ t+ r) b5 @1 W
- */& g8 q2 x, B) T5 T+ u+ S
- int fgetc(FILE *f); x" A# R; |1 w2 x2 M$ q- p
- {0 i) m8 F, F& Y0 Z% q8 G
- uint8_t ch = 0;6 ]; Z0 C6 z' e! D# c
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);/ D0 I4 _, u8 e4 d8 m
- return ch;) ?+ r! K6 z' q0 z
- }
* F- \/ ? y4 {3 Q
复制代码 8 K5 t4 H1 c$ \5 {3 x* N" S4 n: L& {
5.上位机0 ~, O" h4 I1 O( \# V
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应5 L( C; |" k2 q% Y0 B
5 l6 c- F, g& Y0 w
6.串口中断
: k: ^& K* M7 n) l; ?8 h/ I# J在cubemx中配置好中断之后,声明
1 |) H( S" E, Q( GHAL_UART_Receive_IT(&huart1,usart1_rx,6); j) |& n! [7 c+ Q: L/ f
在main函数下添加回调函数
8 S. t$ A. E R1 }( j- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): J$ h$ ]% D6 ^* \* q
- {
% Q7 j5 ~5 |& h- a! w$ I - if(huart->Instance == USART1) // 判断是由哪个串口触发的中断. |% z* K. ^* R- y$ m) u1 B
- {
9 ~( E6 c& A* `7 w& l n - HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长
9 a" l3 {$ i2 y - HAL_UART_Receive_IT(&huart1,usart1_rx,6);
+ I5 E+ Z8 z" M - }
/ G( ~0 q. B+ k: O2 A4 _3 F+ ? - }7 K! K& y+ M0 ]% K2 s6 z* _. t0 {
复制代码 2 g) ?: e$ m, K4 i) T+ i
串口打印
/ F3 ~9 f6 h& u, l4 v# L3 _6 X* p- K" E! x& L L! K& k0 O
) l" t1 m1 f9 a, k% I; U
2 }& o9 ] _& o2 r: c+ Y
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
9 u! v* Y' T3 f* i/ S! e- T! K————————————————" R2 y3 v' A- O& {/ W. \1 J$ ^6 s2 [
版权声明:地球先生_
4 g4 P6 y0 x+ z+ s' u. C如有侵权请联系删除
7 o- j% [+ A& _ r4 s- Q
; f# R9 k5 h2 |, W- S4 c- e! y& z' R6 {
/ V3 G9 t ^5 l5 \- y, P |