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

基于stm32f103经验分享—串口通信

[复制链接]
攻城狮Melo 发布时间:2023-3-22 18:25
串口通讯 (Serial Communication) 是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。9 `4 V8 S; \& l# b8 r" N% ]

8 V  I7 n" n; M$ o! Z! C一.物理层6 h4 X0 l/ j/ l% S4 O' \0 y, K
1.标准
. U" N- X) x! R% A5 B8 K6 S
根据通讯使用的电平标准不同,串口通讯可分为 TTL 标准及 RS-232 标准,RS-232相对TTL有更强的抗干扰能力和传输距离。STM32 的 USART 输出的是 TTL 电平信号,若需要 RS-232 标准的信号可使用 MAX3232 芯片进
& V1 M4 \& B% N( [# l4 ^; C行转换。6 `4 C, [" }4 a0 n8 N8 x
7 m. s5 P( l4 k( u  E
2130b1a6ca0547ff9a58a0b27dc3fbe9.png
- H1 B$ a" q0 }1 O
( ^! O8 j6 Q9 ?: o, X, t- a, ]
2.波特率5 v7 c0 V8 |& ~" s. J. Z
串口通讯是异步通信,异步通讯中没有时钟信号,所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码。
1 `9 a/ `' H0 I$ W( [

1 U5 d3 B& a% q4 v9 A3.引脚8 k: K4 \4 Z3 [5 O$ X+ B5 j
TX:发送数据输出引脚。: h9 G- l- y" C
RX:接收数据输入引脚。
1 t' y3 J+ p5 z" A# {  i# Z* p4 Y(与单片机相连接时,TX----RX,RX------TX)3 B  {  z" f# D& x# v
8 c, P* `! Y3 ?7 `
# O, p8 C! ~. n9 H
二.代码层
  1. HAL_UART_Transmit();串口发送数据,使用超时管理机制
    1 X2 w9 [; W* @& {: q% o7 @6 b
  2. HAL_UART_Receive();串口接收数据,使用超时管理机制$ I! V& s3 D: A! i% _
  3. HAL_UART_Transmit_IT();串口中断模式发送    s9 d, N0 R% D& X
  4. HAL_UART_Receive_IT();串口中断模式接收
    2 Q6 X5 L* m$ I$ D* E$ G& M( O7 ?
  5. HAL_UART_Transmit_DMA();串口DMA模式发送0 A# U1 N) g2 _! R) o
  6. HAL_UART_Transmit_DMA();串口DMA模式接收
    0 e7 h: X9 l6 m* ~/ h/ t
复制代码

$ E, Z0 Z  }% f% X! i4 r1.发送函数
: y) N" k! B2 N1 h6 S7 m! A
  1. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
复制代码
. j; V6 L+ ~: x9 z/ O$ u- \2 Z$ K$ R
8adf45855eba48089994bc38e0c34343.png
& ]& t( ~) {- n( s( q+ i: _/ h4 m6 ?7 d/ l2 W# s7 \9 I  l3 g1 f7 C
这里图片引自Z小旋博主的文章* t9 C" y; ?- i- M! V/ Q

* m; w. |' T7 ]1 U, U! ^5 K- W" A

8 f# p" @! D& c& c; x2.中断接收
* ~% F: P! ?: o- c* I- o# P& L% [$ n
  1. HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
    7 N4 W7 [! g5 _: q7 `5 _
复制代码
  1. 举例:    HAL_UART_Receive_IT(&huart1,(uint8_t *)&value,1);   //中断接收一个字符,存储到value中
    / x2 V' O& Q) [  p1 g6 y
复制代码
! q6 ~2 d: v! ?
3.回调函数6 N/ ?+ N7 I9 Q# Z0 l
  1. HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  
    ( j0 [+ }: ?, z  l" v8 Q; r
复制代码
2 |9 _# {, o8 u4 R' X' Y. f* q
在程序发生中断后,并不会立即结束,会先完成回调函数里面的内容,所以这里可以将想要执行的代码放入回调函数中
+ e' Y0 C. K3 E, o; N6 }# _( F) {9 K& ]9 X) g
4.重定义5 u  l* p" r0 y% t1 u' `
在代码中可直接使用printf打印数据来检测数据
3 t/ t/ t0 ~" ^- h  l
  1. /**$ }2 v% Q0 f: Z9 b5 e
  2.   * 函数功能: 重定向c库函数printf到DEBUG_USARTx, I2 e( G5 v' d
  3.   * 输入参数: 无
    4 C1 |/ @' V" s6 T& ~; b
  4.   * 返 回 值: 无" ~% Q* F, [* Y; s, w0 O3 C
  5.   * 说    明:无1 W, [2 ?" O% e0 o/ a5 I
  6.   */% X, ?5 r& X- V0 Z4 U
  7. int fputc(int ch, FILE *f): H; l3 B. A5 ]! c% v& F# p
  8. {' ^0 K' D0 u5 x) G1 b+ u; A
  9.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
    - U, x1 Y0 Y+ O7 u3 J' K
  10.   return ch;
    ! M6 J- F0 u8 o
  11. }. t% m# m. P! O/ i& ^: H* j4 o
  12.   O5 j) s! H9 n4 o- `: I) i  s
  13. /**
    % d2 x0 ?$ g4 G, Y$ L
  14.   * 函数功能: 重定向c库函数getchar,scanf到DEBUG_USARTx; ^! o' g- g7 M! v0 `  V) B
  15.   * 输入参数: 无
    ) G! d: r2 K; d
  16.   * 返 回 值: 无* E3 s& R9 C2 S5 B/ z9 u
  17.   * 说    明:无2 g& a, ^1 ]1 @0 i+ B* I0 H
  18.   */
    7 Y8 \: v. G3 j
  19. int fgetc(FILE *f)
    * V" C$ m" t; L
  20. {! U; C6 ?9 F7 G+ B. t
  21.   uint8_t ch = 0;
    4 V3 v  m. B3 Q
  22.   HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
      U- r8 G8 [( B" x" y
  23.   return ch;
    ' b! @9 N3 W: _& [0 z/ c# t) O
  24. }! R4 ^- X7 D9 G' p6 H, T# ?; h
复制代码

3 x7 g9 E6 |9 G) u6 q5.上位机2 _6 _% w7 e1 T
常用上位机就是串口调试助手,有vofa+,等各种方便的软件,波特率一定要和配置里面的对应$ J. ]. ]2 X) f+ l3 Z
# b- u' Q+ z; x/ q' J
6.串口中断
; y0 Y. i& m( I" Q( A/ G在cubemx中配置好中断之后,声明( H; i9 K& B0 W# \6 ]8 W! t& D
HAL_UART_Receive_IT(&huart1,usart1_rx,6);% O! Y; Q! A0 {! N! w, a
在main函数下添加回调函数
5 J  c3 E* B' s5 D* c8 c
  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)  K0 j3 Q+ _( v' p- V: X3 O- z/ c
  2. {
    . I7 l/ r7 V+ r6 R1 w+ L7 D$ ^
  3.         if(huart->Instance == USART1)        // 判断是由哪个串口触发的中断) t- l/ @' ?& M) w  E
  4.         {! k9 A$ B' p; V( k0 h# H7 p
  5.                         HAL_UART_Transmit(&huart1,usart1_tx,6,100);        //发送        指针  数组    字节   时长
    + R- p8 w  E4 T  ]5 ^+ Q  f! R8 ]
  6.                         HAL_UART_Receive_IT(&huart1,usart1_rx,6);
    - w/ }( T. u, k
  7.         }/ U) @, p8 ^& e
  8. }3 c" ~% Q1 O7 m1 [; G
复制代码
, o6 X; [: x6 F2 c. K
串口打印* C  q8 ?  u4 d) t; s: |: j6 t; k

5 n$ b* Z! G3 {" K
2c111eb74d5847e7a6e2dcf991e3f054.png 4 W# ^; _/ }0 D' B. R( q9 ]
; N8 p4 F6 f, _/ B7 k! e6 ]' y
每次中断结束都要在回调函数重新开启中断,否则中断里的内容只执行一次6 J; i4 L- ~) [8 p$ R
————————————————
# ]0 N5 V/ G, A1 \5 H$ s' |4 B  V版权声明:地球先生_: T/ i' [4 p  }* f

4 \  b+ B- Y! e: d
, Q% U; e$ F, W4 o- }( H
收藏 评论0 发布时间:2023-3-22 18:25

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版