串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
" }5 X; Q, s; T- L# b4 s& `; c8 W1 d
一.物理层+ R& C% F- V8 u9 Y5 \) x
1.标准, b: }/ A7 b3 G, T n
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进! v" ^0 E1 l; e
行转换。
7 E! d* u( }. s/ z. }5 J# U$ q
' M8 ]+ {( Q7 K& I7 x, e
8 h f, o' ?( }9 `2 G. c8 Z& F
" H* Z7 [% j4 ?$ V2 c5 c
$ {5 `; S3 X8 C* F6 ?2.波特率
X8 t5 C4 k/ i串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
5 n2 h+ B. A& |" U
4 q" T, f# g: G+ R# R! D& }- d3.引脚) c+ X; O6 Z% y& u- `
TX:发送数据输出引脚。7 H& @* R7 K) }' g3 Y8 J
RX:接收数据输入引脚。
# Y1 g, y( E P* d(与单片机相连接时,TX----RX,RX------TX). |+ G/ N. b |& N1 D" D" Y
: N: ?) `) n9 m
* x5 R8 k: P/ H9 R二.代码层4 F3 z1 c$ p0 s; P
- HAL_UART_Transmit();串口发送数据,使用超时管理机制 6 A T r6 E5 i% Y
- HAL_UART_Receive();串口接收数据,使用超时管理机制
; ]" l7 c- A; c9 r: n& [9 R - HAL_UART_Transmit_IT();串口中断模式发送
* d$ @, v. i3 u! p% r! ?- T) L - HAL_UART_Receive_IT();串口中断模式接收
7 E+ R) P6 Z& s% N1 N# @! Y - HAL_UART_Transmit_DMA();串口DMA模式发送) j* u% z4 m+ A/ Y0 F
- HAL_UART_Transmit_DMA();串口DMA模式接收* w+ a8 T/ p- E; G
复制代码
9 ~- n& z+ P7 r0 ]5 y1.发送函数% a7 R& N) l6 p
- HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
; k1 d* ]. c4 y$ Y
复制代码
1 x7 H$ j/ |( w& h/ v
& {1 U& t9 J8 m9 m. v- U/ w. x$ T' K+ N( K3 } O6 a! J& d
这里图片引自Z小旋博主的文章0 M( W3 N5 k3 h! {: ^# |8 @1 ~
2 U+ i3 r3 U+ k* g% ^1 d) b1 U2 N. Q) G. d6 {$ B* [4 g$ Z
2.中断接收: v) O! u. G) J
- HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)3 T4 p( H. {% X" T8 u8 ]
复制代码- 举例: HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1); //中断接收一个字符,存储到value中
7 x' Z* @6 y/ V7 J+ C. ~
复制代码
' v& C# y* l2 `* | }5 I$ x$ A$ p3 z' X3.回调函数
" r- _ a5 q1 s r- HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
. G& V% [' ~! a
复制代码 : w0 I M) [' R0 Q; ^
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中% g& N- p4 G- [
`1 K9 Y; a& c* Z
4.重定义8 K; W- T" |3 H) G
在代码中可直接使用printf打印数据来检测数据+ D( m+ L/ o ]4 \3 S( [
- /**9 K& _- D% v* {; C
- * 函数功能: 重定向c库函数printf到DEBUG_USARTx
/ ~5 x, s3 o& V) d! Y s - * 输入参数: 无! }, p) }# v$ U: X
- * 返 回 值: 无
/ c7 M4 e" `% d f - * 说 明:无8 U0 G% x( R- K
- */
% D' ?9 ^8 P' T& a/ ?7 C2 @" n - int fputc(int ch, FILE *f)
5 a S$ A( e) M+ o z$ E - {
# k6 x4 h0 O4 _6 k3 K - HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);% d2 \4 V7 k6 C. F* l% Z6 C! @
- return ch;
& N$ D8 n3 w3 c9 J2 } - }' Y! Z; b/ S4 C' n3 i7 f
-
* s/ {, X4 f4 w+ q$ Y2 k' u6 A - /**
# e! u0 K2 G! Z& e4 v! [7 ~" k - * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
* o5 t/ f1 m% q - * 输入参数: 无
8 u5 e4 J5 A" ] - * 返 回 值: 无9 X; E8 n. k1 Q; [8 L" X9 M( i. }
- * 说 明:无8 t7 Q; }% B* O9 l* ^$ ^
- */' B+ ^$ m! C2 D. g5 E
- int fgetc(FILE *f)
4 i; M7 W/ G( { - {
4 |; P1 Z9 J4 \ - uint8_t ch = 0;* N8 m4 D" v) C8 w( T% @, V7 E
- HAL_UART_Receive(&huart1, &ch, 1, 0xffff);9 X: j! u; l+ g2 u4 `! T; S
- return ch;+ d$ P6 }$ ~: F8 u# p9 |. m
- }8 o6 t* _7 B2 d/ s4 h, h; Z
复制代码 + T$ n z' L$ M1 ?; O k6 u8 t. M
5.上位机! ^, s# p+ ^ D0 Q$ i* N
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应
' r0 V4 b) B( X, X
3 w1 K( }9 }, M0 d5 o6.串口中断
3 m# l7 P6 K8 e- p1 q9 M5 E( Y0 I在cubemx中配置好中断之后,声明
% ]7 x( ^# K) N- e* \) ]HAL_UART_Receive_IT(&huart1,usart1_rx,6);
' j- S+ _) o' b3 W7 {0 [在main函数下添加回调函数
+ ]3 U q) z: }9 G& g# B- void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)5 F8 b e' ]: [; }3 z$ M P) Q5 z @
- {
* Q1 k) a% y$ t/ m! D - if(huart->Instance == USART1) // 判断是由哪个串口触发的中断8 d# k( j+ Z% N( \: R6 q
- {
6 n" K0 x/ |3 O, S& T - HAL_UART_Transmit(&huart1,usart1_tx,6,100); //发送 指针 数组 字节 时长- `' E4 h5 }. Z& h% k( x4 M
- HAL_UART_Receive_IT(&huart1,usart1_rx,6);
1 r" m0 x! ]5 P, U/ E - }1 H3 v% j- Z" `2 n2 G& M# F* ? b% i
- }
# v1 t. r7 t% n, s
复制代码 0 h4 g! H3 R$ X0 M
串口打印2 w$ ^& e$ N# s0 W
$ h9 `& K# U) Y3 f' V
0 }- [3 H9 [1 @, t0 e
* D- E- y4 M3 u
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次
$ W0 D( d- h3 A3 T) O; J6 \$ p————————————————
, t/ c8 d& Z- D# K版权声明:地球先生_
; T0 r' F" W* A) {# A( a. j如有侵权请联系删除8 O: K/ g6 v, c; G
' m2 R8 X5 f p, O0 q) }
5 l( L' M8 V9 k# I) x6 E- n9 k6 I0 u+ E3 C
|