前言. |/ 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
- strcat函数是将一段字符串拼接到目的字符串上面。
g1 ~; l2 h/ f7 m: l - 下面的例子先打印hello,再打印helloworld。2 l Y ]0 B) r5 c
- % R3 c$ u/ L4 H- h# ^
- #include<stdio.h>! a: D5 o6 P7 z# E6 y
- #include<string.h>
Q* p5 D% K8 l" e7 @) V - 2 J6 t5 f( ]: G
- int main(void)6 h$ c. K4 A4 w& B2 M8 x
- {) K/ f S3 D/ [( x+ G6 Z
- char buf[255] = { 0 };
1 _- |! `/ M+ Y# }' m2 A7 E# | - strcat_s(buf,sizeof(buf) ,"hello");
! [2 H; v X$ d7 }# _5 v) O5 J - printf("%s\n", buf);
7 Q0 {3 N4 C9 _( C - strcat_s(buf, sizeof(buf), "world");! Q, ~" o! P6 d* `0 z
- printf("%s\n", buf);, ?7 Z: |8 `2 I; a7 J
" s* l7 M5 Y( q% {" p- Y- return 0;
, o" Y& M8 \. ?! A1 |8 X - }
复制代码 U1 n3 ~4 M8 A
memset字符串赋值函数
" v* v7 E8 J8 R' Omemset函数可以将字符串数组进行整体赋值。! ^' }* n9 q$ M5 m5 ]+ U
下面例子先打印hello然后再将字符串数组全部赋值为0。- char buf[255] = "hello world";' K5 S8 \/ s1 k8 I
- printf("%s\n", buf);
0 _. J$ J7 U, i6 X - memset(buf, 0, sizeof(buf));7 y9 L2 L. K; W0 d
- printf("%s\n", buf);
复制代码
' v% M- c: N( x( d- wstrstr字符串判断函数
) R) w- y* C0 I2 Jstrstr函数可以用来判断字符串是否存在某一字符串,存在返回1,不存在返回0。- char buf[255] = "hello world";0 X5 E3 N5 N4 n
- if (strstr(buf, "hello"))
$ C4 _1 q6 l) r I; @ - { N& S+ f# T" k: L
- printf("yes");- Y( D( i+ F& H. A# n
- }( f* |. M5 L6 o, p
- else
6 j4 z4 o) r# z5 u3 c - {* E+ ^' w' l2 K, w9 g1 A$ J
- printf("NO");
+ n" x" c$ u) N* V! Q3 k - }
复制代码 - 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
; 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
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( ~
- static uint8_t rx_len;" U v5 l! y8 J8 N, e F5 ~
- static uint8_t rx_data;
9 r }; _; C* V7 O# h4 z; J - static uint8_t usart_rx_buf[200];$ s- I8 ]" w& w9 T/ f+ F; A0 ~0 P
- 0 ]+ `$ r' _" |2 O3 a3 |
- // 串口3启动接收
, b- `) O% w+ M7 f" ]) n2 } - void USART3_StartRx(void)+ N+ N: c: h; d3 G( r* ~
- {/ F9 Q- u2 \ Y9 e/ w( d
- HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);! _* o+ J7 v% c# a
- }
! J! h' T( V, E, @9 o0 R - ) D+ k L5 x; `$ K
- // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
: K4 B$ g l; |" U9 t! H - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
" p# \* F) E6 ?) Y) X7 C - {' w" @5 b0 h; V! u5 y
- usart_rx_buf[rx_len%200] = rx_data;
, D# G0 C( Z P! n - rx_len++;
4 {! p7 u8 N9 M - HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);7 @: L) c, {: R8 X
- }/ g* K ^/ K6 I% P G
- * S- f1 D& a7 b; c! K6 o8 [0 `
- // 串口3接收的数据$ @2 p2 r- D6 {/ o
- uint16_t USART3_Receive(uint8_t *pdata)+ @$ o- _: E: f% u( O3 p2 c
- {5 x: o& @( M6 t" d
- memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);# Q; n3 }; K7 M' D S) h
- return rx_len;
% H2 E7 ^+ D& a - }+ e5 P9 Q2 a* p; j. O1 D
- - l& R. Z2 V5 A0 ]& x- R
- // 串口3发送数据
2 f* a! A# X2 }9 G - void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)
P# U# i5 o6 g8 K - {
# l" M! a; ^7 f" ?; T4 t {# l - HAL_UART_Transmit(&huart3, pData, Size, Timeout);
* b" V" o% X7 l2 R" h% @ - }$ ~* G, I" z* _) w. p2 ?
- 0 L- l; [/ { i
- // 清理串口3接收的数据
! H( Q; `4 N! O( e - void USART3_ClearBuf(void)# z; y! X$ E/ t4 j# b5 R6 V% J
- {
% Y: A. F) n* Q; h$ G5 e1 v - rx_len = 0;9 ^0 I0 k; q. O+ C) k
- memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0$ f$ P; m5 |; X& G
- }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 |