在我们学习STM32串口后,我们可能会有疑问,“我们是否可以实现当我们发送一个指令时,单片机收到并对比我们所需要的指令,如果是我们需要的,立即执行我们所写下的代码”
声明:此贴是了解串口后的综合教程,如果是串口小白,请先在其他帖子中了解相关知识点。
废话少说,我们先来了解一下strcmp函数吧!
strcmp
函数是 C 语言标准库中的一个函数,用于比较两个 C 风格字符串,在 <string.h>
头文件中定义。
strcmp
函数主要用于确定两个字符串是否相等,或者一个字符串在字典序中是否位于另一个字符串之前或之后。
解释:到这里容我先解释解释什么是C风格字符串。C风格字符串是指在C语言中用于表示文本的一种数据结构。它是一个以空字符(\0
)结尾的字符数组。这个空字符标志着字符串的结束,使得程序能够知道字符串在哪里终止。
char cfeng_ge[] = "Hello, World!";
我们的cfeng_ge字数组中存有的字符串"Hello, World!"会自动附一个空白字符(\0)在其末尾。然后才会被存入内存。
H e l l o , W o r l d ! \0
那么我们继续回来说,如何确定两个字符串相等,或者一个字符串在字典序中是否位于另一个字符串之
前或之后。请看代码------>
int strcmp(const char *s1, const char *s2);//函数原型
函数原型不难看出,S1,S2是指向要比较字符串的指针。
函数用法言简意赅
strcmp
函数的返回值表示了两个字符串的字典顺序关系:
- 如果
s1
和s2
是相同的,返回 0。 - 如果
s1
在字典中位于s2
之前,返回一个负整数。 - 如果
s1
在字典中位于s2
之后,返回一个正整数。
最最最重要的是:strcmp
函数通常通过逐个比较两个字符串中的字符来实现。比较会一直进行到遇到不同的字符,或者到达字符串的结尾(即遇到空字符 \0
)。字符的比较通常基于它们的 ASCII 值。并且strcmp
函数是区分大小写的,即大写和小写字符被视为不同的字符。'A'
和 'a'
是不同的。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "Hello";
char str3[] = "World";
int result1 = strcmp(str1, str2);
int result2 = strcmp(str1, str3);
int result3 = strcmp(str3, str1);
printf("strcmp(str1, str2) = %d\n", result1); // 输出 0,因为两个字符串相同
printf("strcmp(str1, str3) = %d\n", result2); // 输出负值,因为 "Hello" 在字典序中位于 "World" 之前
printf("strcmp(str3, str1) = %d\n", result3); // 输出正值,因为 "World" 在字典序中位于 "Hello" 之后
return 0;
}
到这里,我相信在看的小伙伴已经完全掌握strcmp函数。那么它和STM32串口收发又有什么关系--------咱们直接上清晰的代码。
char Serial_RxPacket[100]; //接收到的数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx)
{
assert_param(IS_USART_ALL_PERIPH(USARTx));
return (uint16_t)(USARTx->DR & (uint16_t)0x01FF);
}
uint8_t RxData = USART_ReceiveData(USART1);
Serial_RxPacket[pRxPacket] = RxData; //将RxData存在接受数组内
if (Serial_RxFlag == 1)
{
if (strcmp(Serial_RxPacket, "停止电机") == 0)
{
Serial_SendString("电机停止\r\n");
STEP_MOTOR_OFF();
在表一中,我们将串口接收的数据放置于Rxdata中,再将Rxdata存在串口接收数组中。
在表二中,当串口接收到数据标志位置一,满足if函数,在将我们串口接收到的数据与我们的字符串“停止电机”进行对比,若相同——>函数返回值为0,满足第二个if函数。串口打印“电机停止”,再运行我写的电机停止函数。
现在看来,简直so简单,但有没有想过我们为什么使用它,而不直接进行“电机停止”<-->“电机停止”的字符串比较而需要架起strcmp函数这个桥梁。因为在串口通信中,当我们要发送一个字符(如字母'A')时,实际上我们发送的是该字符对应的ASCII码,而在接收时我们也只能接收ASCII,所以在进行处理甚至比较时,我们只能使用可以操纵ASCII的函数来助阵。故我们才使用strcmp。
下方资源在运行中,需要的包头为A,包未为D。包格式为回车键。