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

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

[复制链接]
STMCU小助手 发布时间:2022-5-21 19:00
前言* a, I' H% C5 K5 A
今天是学习百问网7天智能家居项目的第二天,本篇文章将带大家了解常用的字符串函数串口的一些使用方法。
' K% ~  U2 f2 G7 X/ `) k& u" D# j
+ ?: }% p9 L8 k, s3 N& X! z/ y一、常用的字符串函数+ A$ v, S3 |& r2 H( [, I1 G, o" B
strcat字符串拼接函数

1 F4 k+ t  j- z$ I, qstrcat函数是将一段字符串拼接到目的字符串上面。
) d& z3 N6 i; b5 T8 W8 t下面的例子先打印hello,再打印helloworld。
+ I4 B5 j* H0 }4 \" s; d' p6 D+ q( f' Y# d4 x  ^
  1. #include<stdio.h>
    5 o  }* ~! e1 K6 r
  2. #include<string.h>! k4 R+ H$ N5 t2 B6 b
  3. 8 O3 [3 R1 d) F7 H
  4. int main(void): e$ [3 z9 E3 u7 z3 d
  5. {/ w; T1 C+ p; F- R
  6.         char buf[255] = { 0 };
    * y. i$ r7 T6 u
  7.         strcat_s(buf,sizeof(buf) ,"hello");
    % v8 Y6 O( _% _+ q
  8.         printf("%s\n", buf);
    4 z. ^* k# \2 N. i1 s$ ?5 D
  9.         strcat_s(buf, sizeof(buf), "world");- {0 I" n7 |7 G
  10.         printf("%s\n", buf);: `5 t5 b8 z5 B3 I) Q
  11. 2 g3 R( j) m( u; e8 V( ~" t9 R5 q
  12.         return 0;5 l5 z3 C# j+ {% k$ |0 x% {
  13. }2 J% r# y+ U6 j6 D- r2 M
复制代码

* K. I! [2 }* ~8 y2 }memset字符串赋值函数
7 ^- V) S: i; b9 o) Q8 Tmemset函数可以将字符串数组进行整体赋值。5 B* p1 c: \5 d4 P" K5 l" n! Z
下面例子先打印hello然后再将字符串数组全部赋值为0。1 D# W) P/ y7 }- |( a$ s
$ i, m6 y& Z0 O1 T
  1.         char buf[255] = "hello world";
    8 C) \  x0 X* y& Y. ^
  2.         printf("%s\n", buf);
    , T7 z9 l* J! R: l  p, `
  3.         memset(buf, 0, sizeof(buf));! e7 E% `, c: y5 n
  4.         printf("%s\n", buf);
复制代码

5 Q  g" C& h6 w/ s" n1 q+ @! |; Wstrstr字符串判断函数
5 \2 D& l# E$ {* ~: {strstr函数可以用来判断字符串是否存在某一字符串,存在返回1,不存在返回0。1 N# |6 |" M, X8 Q: ^" P# }1 z& o$ O
5 I# o! H( H% t: P% }
  1.         char buf[255] = "hello world";
    ; }. T1 K  o, ^
  2.         if (strstr(buf, "hello"))) E, l0 c: e. T+ _
  3.         {
    . B# s; l3 q  r" O2 w0 n2 |
  4.                 printf("yes");' j7 V* X" I0 Q6 \. C
  5.         }7 M) L' w. L- j- D8 _) r! k7 b
  6.         else4 E) _4 N4 o8 B4 u
  7.         {9 p: Q6 h- y4 _" `
  8.                 printf("NO");
    4 D4 r% @5 r+ Z; a
  9.         }
    ( Y0 d4 E9 B- e* U* t
复制代码

: V) W2 e. D1 E1 H4 E8 o0 s二、串口的使用
$ a( M+ j# W+ D) n9 ?1.cubeMX的配置
' O- B3 s; c  [: R& u0 f: t' D8 A
设置串口波特率
4 j/ N3 f5 k; z2 t) F
  M4 r8 x! G" b0 y 84@IDMMC_]_4CW`C2UM$T_Y.png
# R3 K. g7 H/ i+ E
. _' ]/ Y) g/ W; ~- c8 a开启串口中断7 c! O* m5 H8 T8 T
3 s) T1 y) K  }% Z
WUV}F}KCE984X%_SU6AD[`Q.png ' s7 B% [: S  k0 u6 z+ V* ?9 f2 G
4 Q" E4 l3 ~5 e" {8 r
2.代码解析
* Z+ u  N& |, x, [将串口发送和接收函数封装好,方便我们使用。
4 v4 w4 I7 F% D7 A' x" C+ ~5 a  s! t8 X- l0 `( a
  1. static uint8_t rx_len;6 J. ]% h7 |% a2 T
  2. static uint8_t rx_data;
    7 r! v. B* T+ Z; f- q4 f
  3. static uint8_t usart_rx_buf[200];
    ' _1 w' W" w  B" O7 T" n+ O6 e

  4. 3 s2 c+ Q* x; X0 I
  5. // 串口3启动接收
    + P8 z# R5 j9 I; U4 o, h" w6 ^
  6. void USART3_StartRx(void)' k% i. z+ |7 g
  7. {' n* A. y; a, \" c' H3 Y
  8.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);0 P! i( N/ M1 I; e6 ?+ k
  9. }+ m* j+ Z. K. e

  10.   E- U/ X) B3 w0 ]2 Q+ ^
  11. // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
    2 M/ S) ?: X* j$ Q
  12. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)' B8 b* Q4 ^# z0 k2 b" P
  13. {) [, P6 Z+ m  g+ L. e
  14.         usart_rx_buf[rx_len%200] = rx_data;
    / t# i0 t6 x/ U) {* A
  15.         rx_len++;
    8 A/ r$ g2 N: b' X0 W
  16.         HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
    , _1 ?- N2 }1 L  _# b
  17. }( ?3 h, z& R! b, {# _3 `

  18. . `# V. h9 r. e# ^' n! L( q
  19. // 串口3接收的数据
    - S( K- G) [( z
  20. uint16_t USART3_Receive(uint8_t *pdata)
    1 m$ g9 E; O- ^/ L# S3 }* n
  21. {5 N" }  D0 t5 e
  22.         memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);. C  s3 |2 R4 _" @, v
  23.         return rx_len;0 j7 \( H' r6 F. J6 e4 x
  24. }& |$ N" y" a6 H% ^. g, J. u

  25. $ j* r$ V2 G7 {5 x4 l4 z: U
  26. // 串口3发送数据
    / m$ m8 w0 T% I% {, ]+ N2 }+ z7 d1 ~
  27. void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)! @5 p5 i  j0 F- e
  28. {
    ( n" q8 x6 o+ @) Q8 J9 q- P3 G6 ~: v
  29.         HAL_UART_Transmit(&huart3, pData, Size, Timeout);
    1 B- ~; x. d* e
  30. }' V9 a: l$ v9 b0 a

  31. # d* {' N0 l# C& t; S; ?
  32. // 清理串口3接收的数据
    , a3 L( h( {* Q
  33. void USART3_ClearBuf(void)/ S  {- `6 B4 c) Z1 C2 ]9 N3 @
  34. {9 r( l9 T+ v! |! K8 J
  35.         rx_len = 0;8 J3 s. H0 m& O) p! G* V( ]/ I( d2 Q
  36.         memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0$ L" A) E( P0 Q, F1 ]# {
  37. }
    ' O* k- Q* {# l0 B/ T

  38. - @& D5 ~& W3 p( \. T
复制代码

+ k; N+ b7 d# U: K6 I  t总结& @( U+ g% M7 L& C5 A; g
串口通信在平时项目开发过程中还是会经常使用到的,希望大家能够好好学习一下。
6 I+ |2 A" _, j  p3 t, x- {# j9 j  v) {+ }

$ r. A3 w' Y% T  }* i1 Z
赞 收藏 评论0 发布时间:2022-5-21 19:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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