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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-1 16:45
串口通讯 (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
2130b1a6ca0547ff9a58a0b27dc3fbe9.png
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
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制 6 A  T  r6 E5 i% Y
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制
    ; ]" l7 c- A; c9 r: n& [9 R
  3. HAL_UART_Transmit_IT();串口中断模式发送  
    * d$ @, v. i3 u! p% r! ?- T) L
  4. HAL_UART_Receive_IT();串口中断模式接收
    7 E+ R) P6 Z& s% N1 N# @! Y
  5. HAL_UART_Transmit_DMA();串口DMA模式发送) j* u% z4 m+ A/ Y0 F
  6. HAL_UART_Transmit_DMA();串口DMA模式接收* w+ a8 T/ p- E; G
复制代码

9 ~- n& z+ P7 r0 ]5 y1.发送函数% a7 R& N) l6 p
  1. 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 8adf45855eba48089994bc38e0c34343.png
& {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) b
1 U2 N. Q) G. d6 {$ B* [4 g$ Z
2.中断接收: v) O! u. G) J
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)3 T4 p( H. {% X" T8 u8 ]
复制代码
  1. 举例:    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
  1. 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( [
  1. /**9 K& _- D% v* {; C
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx
    / ~5 x, s3 o& V) d! Y  s
  3.   * 输入参数: 无! }, p) }# v$ U: X
  4.   * 返 回 值: 无
    / c7 M4 e" `% d  f
  5.   * 说    明:无8 U0 G% x( R- K
  6.   */
    % D' ?9 ^8 P' T& a/ ?7 C2 @" n
  7. int fputc(int ch, FILE *f)
    5 a  S$ A( e) M+ o  z$ E
  8. {
    # k6 x4 h0 O4 _6 k3 K
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);% d2 \4 V7 k6 C. F* l% Z6 C! @
  10.   return ch;
    & N$ D8 n3 w3 c9 J2 }
  11. }' Y! Z; b/ S4 C' n3 i7 f

  12. * s/ {, X4 f4 w+ q$ Y2 k' u6 A
  13. /**
    # e! u0 K2 G! Z& e4 v! [7 ~" k
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx
    * o5 t/ f1 m% q
  15.   * 输入参数: 无
    8 u5 e4 J5 A" ]
  16.   * 返 回 值: 无9 X; E8 n. k1 Q; [8 L" X9 M( i. }
  17.   * 说    明:无8 t7 Q; }% B* O9 l* ^$ ^
  18.   */' B+ ^$ m! C2 D. g5 E
  19. int fgetc(FILE *f)
    4 i; M7 W/ G( {
  20. {
    4 |; P1 Z9 J4 \
  21.   uint8_t ch = 0;* N8 m4 D" v) C8 w( T% @, V7 E
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);9 X: j! u; l+ g2 u4 `! T; S
  23.   return ch;+ d$ P6 }$ ~: F8 u# p9 |. m
  24. }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
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)5 F8 b  e' ]: [; }3 z$ M  P) Q5 z  @
  2. {
    * Q1 k) a% y$ t/ m! D
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断8 d# k( j+ Z% N( \: R6 q
  4.         {
    6 n" K0 x/ |3 O, S& T
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长- `' E4 h5 }. Z& h% k( x4 M
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
    1 r" m0 x! ]5 P, U/ E
  7.         }1 H3 v% j- Z" `2 n2 G& M# F* ?  b% i
  8. }
    # 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
2c111eb74d5847e7a6e2dcf991e3f054.png 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
赞 收藏 评论0 发布时间:2023-5-1 16:45

举报

0个回答

所属标签

相似技术帖

官网相关资源

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