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

【经验分享】STM32智能家居7天小项目串口的使用

[复制链接]
STMCU小助手 发布时间:2022-5-20 19:15
前言. |/ t/ g6 p) A0 z# |
今天是学习百问网7天智能家居项目的第二天,本篇文章将带大家了解常用的字符串函数串口的一些使用方法。3 L. a& E+ P# i9 m2 q
; F: ~; W$ r" ^* Y
一、常用的字符串函数
2 v, ^" e$ N" f) B! P9 sstrcat字符串拼接函数: L. V( L( Y# B; x
  1. strcat函数是将一段字符串拼接到目的字符串上面。
      g1 ~; l2 h/ f7 m: l
  2. 下面的例子先打印hello,再打印helloworld。2 l  Y  ]0 B) r5 c
  3. % R3 c$ u/ L4 H- h# ^
  4. #include<stdio.h>! a: D5 o6 P7 z# E6 y
  5. #include<string.h>
      Q* p5 D% K8 l" e7 @) V
  6. 2 J6 t5 f( ]: G
  7. int main(void)6 h$ c. K4 A4 w& B2 M8 x
  8. {) K/ f  S3 D/ [( x+ G6 Z
  9.         char buf[255] = { 0 };
    1 _- |! `/ M+ Y# }' m2 A7 E# |
  10.         strcat_s(buf,sizeof(buf) ,"hello");
    ! [2 H; v  X$ d7 }# _5 v) O5 J
  11.         printf("%s\n", buf);
    7 Q0 {3 N4 C9 _( C
  12.         strcat_s(buf, sizeof(buf), "world");! Q, ~" o! P6 d* `0 z
  13.         printf("%s\n", buf);, ?7 Z: |8 `2 I; a7 J

  14. " s* l7 M5 Y( q% {" p- Y
  15.         return 0;
    , o" Y& M8 \. ?! A1 |8 X
  16. }
复制代码
  U1 n3 ~4 M8 A
memset字符串赋值函数
" v* v7 E8 J8 R' Omemset函数可以将字符串数组进行整体赋值。! ^' }* n9 q$ M5 m5 ]+ U
下面例子先打印hello然后再将字符串数组全部赋值为0。
  1.         char buf[255] = "hello world";' K5 S8 \/ s1 k8 I
  2.         printf("%s\n", buf);
    0 _. J$ J7 U, i6 X
  3.         memset(buf, 0, sizeof(buf));7 y9 L2 L. K; W0 d
  4.         printf("%s\n", buf);
复制代码

' v% M- c: N( x( d- wstrstr字符串判断函数
) R) w- y* C0 I2 Jstrstr函数可以用来判断字符串是否存在某一字符串,存在返回1,不存在返回0。
  1.         char buf[255] = "hello world";0 X5 E3 N5 N4 n
  2.         if (strstr(buf, "hello"))
    $ C4 _1 q6 l) r  I; @
  3.         {  N& S+ f# T" k: L
  4.                 printf("yes");- Y( D( i+ F& H. A# n
  5.         }( f* |. M5 L6 o, p
  6.         else
    6 j4 z4 o) r# z5 u3 c
  7.         {* E+ ^' w' l2 K, w9 g1 A$ J
  8.                 printf("NO");
    + n" x" c$ u) N* V! Q3 k
  9.         }
复制代码
- d* Y8 \3 ?! ~  u" H4 R  J: N
二、串口的使用
  l0 i4 x8 t+ R1.cubeMX的配置
* _. G2 L3 |8 ?9 u5 ]7 F设置串口波特率% k& Q: \/ }6 }1 t# M: V/ a: r( }& u
4 ?0 ?( M- p5 ~( ~; j- B% o! d
TJVMEZRR{H6E$`[A64P21[0.png ; d6 Q6 u7 q/ y3 B! N

7 Y2 F' Y( Q  r. j' G开启串口中断' |/ e: O; F' ~5 j
* z5 L; ?9 B4 g( P' E+ z
OT{YD$PLELQ0[~8V4A3F@VU.png 5 C6 r  |# D( ?. K, l' R
/ F8 K1 @3 `, b$ p% D5 i+ r
2.代码解析7 S, n! j* k. M6 r9 T! y8 `6 W$ |
将串口发送和接收函数封装好,方便我们使用。) f* Z6 Y# ]/ h
2 J- H' w5 x; }" F( ~
  1. static uint8_t rx_len;" U  v5 l! y8 J8 N, e  F5 ~
  2. static uint8_t rx_data;
    9 r  }; _; C* V7 O# h4 z; J
  3. static uint8_t usart_rx_buf[200];$ s- I8 ]" w& w9 T/ f+ F; A0 ~0 P
  4. 0 ]+ `$ r' _" |2 O3 a3 |
  5. // 串口3启动接收
    , b- `) O% w+ M7 f" ]) n2 }
  6. void USART3_StartRx(void)+ N+ N: c: h; d3 G( r* ~
  7. {/ F9 Q- u2 \  Y9 e/ w( d
  8.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);! _* o+ J7 v% c# a
  9. }
    ! J! h' T( V, E, @9 o0 R
  10. ) D+ k  L5 x; `$ K
  11. // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
    : K4 B$ g  l; |" U9 t! H
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    " p# \* F) E6 ?) Y) X7 C
  13. {' w" @5 b0 h; V! u5 y
  14.         usart_rx_buf[rx_len%200] = rx_data;
    , D# G0 C( Z  P! n
  15.         rx_len++;
    4 {! p7 u8 N9 M
  16.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);7 @: L) c, {: R8 X
  17. }/ g* K  ^/ K6 I% P  G
  18. * S- f1 D& a7 b; c! K6 o8 [0 `
  19. // 串口3接收的数据$ @2 p2 r- D6 {/ o
  20. uint16_t USART3_Receive(uint8_t *pdata)+ @$ o- _: E: f% u( O3 p2 c
  21. {5 x: o& @( M6 t" d
  22.         memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);# Q; n3 }; K7 M' D  S) h
  23.         return rx_len;
    % H2 E7 ^+ D& a
  24. }+ e5 P9 Q2 a* p; j. O1 D
  25. - l& R. Z2 V5 A0 ]& x- R
  26. // 串口3发送数据
    2 f* a! A# X2 }9 G
  27. void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)
      P# U# i5 o6 g8 K
  28. {
    # l" M! a; ^7 f" ?; T4 t  {# l
  29.         HAL_UART_Transmit(&huart3, pData, Size, Timeout);
    * b" V" o% X7 l2 R" h% @
  30. }$ ~* G, I" z* _) w. p2 ?
  31. 0 L- l; [/ {  i
  32. // 清理串口3接收的数据
    ! H( Q; `4 N! O( e
  33. void USART3_ClearBuf(void)# z; y! X$ E/ t4 j# b5 R6 V% J
  34. {
    % Y: A. F) n* Q; h$ G5 e1 v
  35.         rx_len = 0;9 ^0 I0 k; q. O+ C) k
  36.         memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0$ f$ P; m5 |; X& G
  37. }5 G! m  i' d, a% a3 c3 Y& x. Y; }
复制代码

- C, f0 I, N$ e2 y- V8 q. @
  j/ J0 W8 |2 L7 y  c% ]% q! i5 G总结4 z' h, x; R5 F$ |1 N% L
串口通信在平时项目开发过程中还是会经常使用到的,希望大家能够好好学习一下。
: I9 |# t. E" P( S( H$ o; \% N4 P7 T: ]3 M

$ Y1 r6 F6 m; n1 I' B3 A, l
赞 收藏 评论0 发布时间:2022-5-20 19:15

举报

0个回答

所属标签

相似技术帖

官网相关资源

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