STM32 串口接收-比对信息的利器——strcmp函数

在我们学习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。包格式为回车键。

【免费】strcmp函数在传口中的实践资源-CSDN文库

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值