前言* 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 ^
- #include<stdio.h>
5 o }* ~! e1 K6 r - #include<string.h>! k4 R+ H$ N5 t2 B6 b
- 8 O3 [3 R1 d) F7 H
- int main(void): e$ [3 z9 E3 u7 z3 d
- {/ w; T1 C+ p; F- R
- char buf[255] = { 0 };
* y. i$ r7 T6 u - strcat_s(buf,sizeof(buf) ,"hello");
% v8 Y6 O( _% _+ q - printf("%s\n", buf);
4 z. ^* k# \2 N. i1 s$ ?5 D - strcat_s(buf, sizeof(buf), "world");- {0 I" n7 |7 G
- printf("%s\n", buf);: `5 t5 b8 z5 B3 I) Q
- 2 g3 R( j) m( u; e8 V( ~" t9 R5 q
- return 0;5 l5 z3 C# j+ {% k$ |0 x% {
- }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
- char buf[255] = "hello world";
8 C) \ x0 X* y& Y. ^ - printf("%s\n", buf);
, T7 z9 l* J! R: l p, ` - memset(buf, 0, sizeof(buf));! e7 E% `, c: y5 n
- 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% }
- char buf[255] = "hello world";
; }. T1 K o, ^ - if (strstr(buf, "hello"))) E, l0 c: e. T+ _
- {
. B# s; l3 q r" O2 w0 n2 | - printf("yes");' j7 V* X" I0 Q6 \. C
- }7 M) L' w. L- j- D8 _) r! k7 b
- else4 E) _4 N4 o8 B4 u
- {9 p: Q6 h- y4 _" `
- printf("NO");
4 D4 r% @5 r+ Z; a - }
( 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
# R3 K. g7 H/ i+ E
. _' ]/ Y) g/ W; ~- c8 a开启串口中断7 c! O* m5 H8 T8 T
3 s) T1 y) K }% Z
' 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
- static uint8_t rx_len;6 J. ]% h7 |% a2 T
- static uint8_t rx_data;
7 r! v. B* T+ Z; f- q4 f - static uint8_t usart_rx_buf[200];
' _1 w' W" w B" O7 T" n+ O6 e
3 s2 c+ Q* x; X0 I- // 串口3启动接收
+ P8 z# R5 j9 I; U4 o, h" w6 ^ - void USART3_StartRx(void)' k% i. z+ |7 g
- {' n* A. y; a, \" c' H3 Y
- HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);0 P! i( N/ M1 I; e6 ?+ k
- }+ m* j+ Z. K. e
E- U/ X) B3 w0 ]2 Q+ ^- // 串口3中断回调函数(保存每次接收的数据,并启动下一次接收)
2 M/ S) ?: X* j$ Q - void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)' B8 b* Q4 ^# z0 k2 b" P
- {) [, P6 Z+ m g+ L. e
- usart_rx_buf[rx_len%200] = rx_data;
/ t# i0 t6 x/ U) {* A - rx_len++;
8 A/ r$ g2 N: b' X0 W - HAL_UART_Receive_IT(&huart3, (uint8_t*)&rx_data, 1);
, _1 ?- N2 }1 L _# b - }( ?3 h, z& R! b, {# _3 `
. `# V. h9 r. e# ^' n! L( q- // 串口3接收的数据
- S( K- G) [( z - uint16_t USART3_Receive(uint8_t *pdata)
1 m$ g9 E; O- ^/ L# S3 }* n - {5 N" } D0 t5 e
- memcpy(pdata, (uint8_t*)usart_rx_buf, rx_len);. C s3 |2 R4 _" @, v
- return rx_len;0 j7 \( H' r6 F. J6 e4 x
- }& |$ N" y" a6 H% ^. g, J. u
$ j* r$ V2 G7 {5 x4 l4 z: U- // 串口3发送数据
/ m$ m8 w0 T% I% {, ]+ N2 }+ z7 d1 ~ - void USART3_Transmit(uint8_t *pData, uint16_t Size, uint32_t Timeout)! @5 p5 i j0 F- e
- {
( n" q8 x6 o+ @) Q8 J9 q- P3 G6 ~: v - HAL_UART_Transmit(&huart3, pData, Size, Timeout);
1 B- ~; x. d* e - }' V9 a: l$ v9 b0 a
# d* {' N0 l# C& t; S; ?- // 清理串口3接收的数据
, a3 L( h( {* Q - void USART3_ClearBuf(void)/ S {- `6 B4 c) Z1 C2 ]9 N3 @
- {9 r( l9 T+ v! |! K8 J
- rx_len = 0;8 J3 s. H0 m& O) p! G* V( ]/ I( d2 Q
- memset((uint8_t*)usart_rx_buf, 0, 200);//将数据都清除为0$ L" A) E( P0 Q, F1 ]# {
- }
' O* k- Q* {# l0 B/ T
- @& 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 |