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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (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
2130b1a6ca0547ff9a58a0b27dc3fbe9.png ! 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
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制 / j# F7 p4 N$ \* ?( E
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制
    ' X' E  q7 ~9 r* s
  3. HAL_UART_Transmit_IT();串口中断模式发送  ( C# L4 ]$ i$ M2 B! l
  4. HAL_UART_Receive_IT();串口中断模式接收: _4 D1 g3 d% v0 y1 a* T
  5. HAL_UART_Transmit_DMA();串口DMA模式发送+ u5 B" j" ?/ m9 Y5 f9 U1 K: I, T
  6. HAL_UART_Transmit_DMA();串口DMA模式接收
    9 \3 n& |$ j, v& A1 c
复制代码

2 |' W1 O1 z* J1.发送函数9 f. D1 o1 ~3 e1 `
  1. 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 8adf45855eba48089994bc38e0c34343.png : 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
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)$ S" V' Z9 y! B4 A8 U* H  k" Z
复制代码
  1. 举例:    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
  1. 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; o
4.重定义. B9 x: m& w3 W  }# q, S5 B
在代码中可直接使用printf打印数据来检测数据' H( P8 E+ K% X% j% i& {
  1. /**
    . C8 R: ~; w- {- d  n% |
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx3 [" d6 g0 i0 K% F# e9 g6 n+ M
  3.   * 输入参数: 无
    8 f" T3 Q6 E/ G. B) W
  4.   * 返 回 值: 无' G5 x4 s( K8 t; e: M
  5.   * 说    明:无! ~2 f3 i; a2 V" k& y& @
  6.   */' g! {* V# @" G3 ^
  7. int fputc(int ch, FILE *f)% }0 T2 X( m& z: G* \
  8. {
    4 P3 r$ l! U4 |8 [' `9 x6 H. v( L
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);0 A! c8 x. z6 C7 g! z8 `3 y% Q
  10.   return ch;: C( C2 d4 U' ~; O4 C3 n. a
  11. }
    7 \, v. e. w  M

  12. / |7 |+ a* z5 F2 o0 e0 |
  13. /**
    : x+ p; @# s9 D) @6 }# Z
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
    : F8 _3 H( B4 ?& ~2 h$ y
  15.   * 输入参数: 无+ M' E1 H: z' K* }$ b( K+ H
  16.   * 返 回 值: 无7 E% n$ ?0 w$ r0 f4 H$ e
  17.   * 说    明:无
    7 K. A6 @) M6 @, g1 k! k8 p
  18.   */
    . m0 C8 n6 G1 n& g8 F& y; ~
  19. int fgetc(FILE *f). k6 y+ Z( Q1 ~7 g4 y- i. C! t
  20. {  i! y5 f  p2 I8 C
  21.   uint8_t ch = 0;% e0 l- d4 @  f- K! D; {
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);3 T5 q9 m7 e* X
  23.   return ch;3 r8 _6 \3 |+ |; L. C, q. V4 c5 Z
  24. }; 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
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart): o1 {+ X: r1 G3 p2 Y; u5 ]: W- F
  2. {! t) t  a2 ]' I) F+ r! k: G( s
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断
    0 G7 h3 j8 D( n$ u- }' q$ {4 b
  4.         {3 d( u* B) p5 n8 m$ t
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长6 V: A* P& [0 d) [, h! h9 y& m
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
    9 I% d8 Q4 b1 F2 Y$ }; Y
  7.         }
    7 B9 H$ h, s" s% G2 E8 w' {" q
  8. }: _# p( O- [+ R
复制代码

. O) P% Z. ]$ ]串口打印
+ I! L$ t' D8 l' r0 ~5 [; i' U) _9 g% t% F7 Y. n+ f
2c111eb74d5847e7a6e2dcf991e3f054.png
- n2 A: A' Y& i) P7 |6 s
1 ?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 ]
赞 收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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