你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于stm32f103的HAL库CUBEMX串口通信经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (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 ^
2130b1a6ca0547ff9a58a0b27dc3fbe9.png
  ]( 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
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制 / {7 h! x/ f4 \# r
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制3 l$ N7 \9 o, Y: m6 O5 ~, l
  3. HAL_UART_Transmit_IT();串口中断模式发送  - Z! w/ L% N! W4 y1 {
  4. HAL_UART_Receive_IT();串口中断模式接收0 _, Q$ m! _6 o2 D/ x
  5. HAL_UART_Transmit_DMA();串口DMA模式发送
    9 z6 R; |+ |+ v0 \3 S3 s9 m- M8 V3 W
  6. 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
  1. 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/ [
8adf45855eba48089994bc38e0c34343.png * 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
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)9 D5 ?; y6 V: I+ _; t- `, R  P' e
复制代码
  1. 举例:    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! }
  1. 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
  1. /**
    5 k4 p& R. ?) g, C
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx, |$ `7 s. z  n3 S. p! r8 w( t1 F7 \
  3.   * 输入参数: 无
    - j4 J* b3 R6 j% E
  4.   * 返 回 值: 无7 j1 k( k7 [+ ?
  5.   * 说    明:无6 X" w! e6 a( `$ S
  6.   */# u: X5 h3 c9 _! H) g* `) L
  7. int fputc(int ch, FILE *f)
    8 E9 h! m2 e" x! J+ n$ ~
  8. {
    " k) {* ~; G8 X) d- i
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
    ) ?8 e8 W1 p( }* w0 `; w4 p7 w
  10.   return ch;
    * C5 l+ W# l  ~1 p
  11. }
    0 v, w' D  d/ v. P& C- G) W. p- Q

  12. % ~: V2 T/ F( {/ z. F, w: `/ l0 a/ ~
  13. /**
    6 Q5 M0 D% u! B
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
    / F0 I6 z, k2 M5 d7 Z: C
  15.   * 输入参数: 无9 ]& h9 z5 G. d$ \* f/ k/ ]* ~) z% F
  16.   * 返 回 值: 无
    2 k0 a( t& X7 Q
  17.   * 说    明:无
    ! ?' i9 b  Y! p, ~) v
  18.   */
    ' h' x+ |7 x4 V) x5 `; w+ G# z! T
  19. int fgetc(FILE *f)
    1 f4 u8 r% f# R/ `$ W
  20. {
    0 n! r0 @5 d' J6 N
  21.   uint8_t ch = 0;  |2 i5 t; _/ @7 k. V& e7 b
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);5 d0 }7 A3 M( D
  23.   return ch;+ G2 O% Q! I" Z0 q$ ?; H
  24. }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
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)* w% M8 W9 ^2 Z/ x1 r" H4 V. r# n
  2. {! D/ F9 y3 z! B+ M
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断7 O6 c- I6 T, M* `% ]( K, ?- w
  4.         {9 U4 o5 Z1 @  T9 Z, z. d6 P) H
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长
    4 g2 u* V6 \4 F' r% A
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);7 K5 \1 k2 f) s& ?9 b
  7.         }% m% V) ^( J$ f9 F3 K
  8. }& 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
2c111eb74d5847e7a6e2dcf991e3f054.png
* M( |4 H  P! q$ E$ V2 ^! s
9 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
赞 收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版