串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。" U) L5 i/ W3 [- O- o' F& {
0 D4 l! F7 q" D/ ~& j( _
一.物理层
[1 Q9 w9 F& W9 w1.标准
6 k. C, S+ o G( q3 l根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进
: q; c( D) S& k/ e9 ~行转换。6 k$ d Y1 W# X" X1 D" e
' R4 N6 |8 T5 p
! C) P5 A5 @; G7 g2 \' y
6 _% ^1 i* z; z
8 ^+ d8 T' }) C$ D7 l( X) u2.波特率6 [( u9 j3 Z: ]
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
2 w5 K2 N1 |4 ]( Q' x& H( i$ Y4 X {) @7 w$ C+ D: }6 r
3.引脚
. O I9 O5 z# [- S5 QTX:发送数据输出引脚。5 _# A- r7 `4 T* h( y
RX:接收数据输入引脚。
, n6 D5 [" P# w2 O' z r4 u/ T(与单片机相连接时,TX----RX,RX------TX)- g& _/ Q% ?3 k" |* `/ [
% r; h# V x- g9 n% c+ `. ?# S2 V
; r% F8 W* m5 X9 `5 y, ~( |二.代码层
9 r- k9 a1 _7 {. ?; \- H+ D0 R- HAL_UART_Transmit();串口发送数据,使用超时管理机制 / j# F7 p4 N$ \* ?( E
- HAL_UART_Receive();串口接收数据,使用超时管理机制
' X' E q7 ~9 r* s - HAL_UART_Transmit_IT();串口中断模式发送 ( C# L4 ]$ i$ M2 B! l
- HAL_UART_Receive_IT();串口中断模式接收: _4 D1 g3 d% v0 y1 a* T
- HAL_UART_Transmit_DMA();串口DMA模式发送+ u5 B" j" ?/ m9 Y5 f9 U1 K: I, T
- HAL_UART_Transmit_DMA();串口DMA模式接收
9 \3 n& |$ j, v& A1 c
复制代码
2 |' W1 O1 z* J1.发送函数9 f. D1 o1 ~3 e1 `
- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)1 l \/ @' p5 R
复制代码
2 q9 d' B) `0 E, E1 @% f5 b8 Q5 q+ Y
: h# N. H( E. p/ I/ d% P" D
4 e6 o! G0 b: S# y这里图片引自Z小旋博主的文章
9 ?! J. i) k/ ?1 j9 H8 g$ f+ m: B0 `
# R" i6 H) _1 ?7 L! ] g
2.中断接收* e8 d6 Y9 U: _: p" C- T! B
- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)$ S" V' Z9 y! B4 A8 U* H k" Z
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中9 r$ f9 t4 K+ m; ^, X9 v
复制代码 9 Q. i, y5 O R i% l/ [
3.回调函数* j) F9 D' T# V& Z
- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
0 [' o3 [- _" \9 ]" m& }
复制代码 4 r$ P8 _7 {$ J' m: e. A, N
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中. @9 m9 G" u: O; A
8 G2 H3 Z: b. v* u: c4 s; o4.重定义. B9 x: m& w3 W }# q, S5 B
在代码中可直接使用printf打印数据来检测数据' H( P8 E+ K% X% j% i& {
- /**
. C8 R: ~; w- {- d n% | - * 函数功能: 重定向c库函数printf到DEBUG_USARTx3 [" d6 g0 i0 K% F# e9 g6 n+ M
- * 输入参数: 无
8 f" T3 Q6 E/ G. B) W - * 返 回 值: 无' G5 x4 s( K8 t; e: M
- * 说 明:无! ~2 f3 i; a2 V" k& y& @
- */' g! {* V# @" G3 ^
- int fputc(int ch, FILE *f)% }0 T2 X( m& z: G* \
- {
4 P3 r$ l! U4 |8 [' `9 x6 H. v( L - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);0 A! c8 x. z6 C7 g! z8 `3 y% Q
- return ch;: C( C2 d4 U' ~; O4 C3 n. a
- }
7 \, v. e. w M -
/ |7 |+ a* z5 F2 o0 e0 | - /**
: x+ p; @# s9 D) @6 }# Z - * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
: F8 _3 H( B4 ?& ~2 h$ y - * 输入参数: 无+ M' E1 H: z' K* }$ b( K+ H
- * 返 回 值: 无7 E% n$ ?0 w$ r0 f4 H$ e
- * 说 明:无
7 K. A6 @) M6 @, g1 k! k8 p - */
. m0 C8 n6 G1 n& g8 F& y; ~ - int fgetc(FILE *f). k6 y+ Z( Q1 ~7 g4 y- i. C! t
- { i! y5 f p2 I8 C
- uint8_t ch = 0;% e0 l- d4 @ f- K! D; {
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);3 T5 q9 m7 e* X
- return ch;3 r8 _6 \3 |+ |; L. C, q. V4 c5 Z
- }; z- G" p1 E: \" e& U* g
复制代码 . t, X8 f( q& u1 u L
5.上位机" C, h) m) y& y. T6 l3 ~
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应
' r/ b3 ^0 y7 {& G1 i" f
& s s: t7 e( C8 E0 b g0 @6.串口中断
* z w5 ]" M% A) V/ m在cubemx中配置好中断之后,声明( @1 q* f; z8 B- q3 \. @. n
HAL_UART_Receive_IT(&huart1,usart1_rx,6);
/ [; K/ h+ p- F7 s在main函数下添加回调函数 _- [( a R1 F% D
- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): o1 {+ X: r1 G3 p2 Y; u5 ]: W- F
- {! t) t a2 ]' I) F+ r! k: G( s
- if(huart->Instance == USART1) // 判断是由哪个串口触发的中断
0 G7 h3 j8 D( n$ u- }' q$ {4 b - {3 d( u* B) p5 n8 m$ t
- HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长6 V: A* P& [0 d) [, h! h9 y& m
- HAL_UART_Receive_IT(&huart1,usart1_rx,6);
9 I% d8 Q4 b1 F2 Y$ }; Y - }
7 B9 H$ h, s" s% G2 E8 w' {" q - }: _# p( O- [+ R
复制代码
. O) P% Z. ]$ ]串口打印
+ I! L$ t' D8 l' r0 ~5 [; i' U) _9 g% t% F7 Y. n+ f
- n2 A: A' Y& i) P7 |6 s1 ?2 N6 f9 {! n( o# U
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
. ?* V5 i* w2 R: ?————————————————
+ T; M0 Z" g0 j版权声明:地球先生_9 d# E6 m6 _' b" b; l. L; {
如有侵权请联系删除6 u" U% ~9 e* a6 N
* L5 ]4 _3 |0 J- ]4 J* {
) r2 w6 T' b! X; a( ? ^
: I4 h$ z. P$ T" E4 ]
|