c语言字符串命令解析

c语言字符串命令解析

目录

简介

最近在做stm32的串口通信,想用串口发布指令,修改stm32程序里的一些参数,或者做出一些命令,尝试写一下字符串的命令解析程序。

c语言程序

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h>
int main() 
{ 
    char* find_space(char *str)
    {
        char* p=str;
        while(*str!='\n')
        {
            if(*str==' ')
            {
                return str;
            }
            str++;
        }
        return str-1;
    }
    void assignment(char *str)
    {
        switch(*str)
        {
            case 'm': printf("m:%f\n",atof(str+1));break;
            case 'p': printf("p:%f\n",atof(str+1));break;
            default:printf("Error!\n");break;
        }
    }
    void string_translate(char *str)
    {
        char *p;
        char buffer[10]; 
        while(*str!='\n')
        {
            p=find_space(str);
            if(p!=str)
            {
                strncpy(buffer,str,p-str+1); 
                assignment(buffer);
                memset(buffer,0, sizeof(buffer));
            str=p+1;
            }
            else
            {
                p++;
                str++;
            }
        }
    }
    char receive[]="  m78.8  p10   m909   \n";
    string_translate(receive);
    system("pause");
    return 0; 
 }

测试结果

输入为:” m78.8 p10 m909 \n”
输出可以在assignment函数里修改想要的效果
字符串解析c语言测试结果

stm32程序

这里不讲配置和一些头文件的东西,有机会再整理。
usart.c

/**
* @brief  上位机发送字符串,控制参数变化
  * @param  无
  * @retval 无
  */
char str[100]="";
int k=0;

void USART1_IRQHandler(void)
{
 char temp;
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    {
        temp = USART_ReceiveData( USART1 );//接收一个字符,并且保存到temp
        /*第一步,保存字符串*/
            if(temp!='\n')//判断是不是结束符'\n'
        {
            str[k]=temp;
            k++;
        }
        /*第二步,执行字符串*/
        if(temp=='\n')
        {
            str[k]=temp;
            string_translate(str);
        /*第三步,清空字符串*/
            memset(str,'\0',length(str));
            k=0;
        }
    }
}

command.c

/**
  ******************************************************************************
  * @file    command.c
  * @author  cabbage
  * @version V1.0
  * @date    2018-08-29
  * @brief   命令解析
  ******************************************************************************
  * @attention
  *
  * 实验平台:STM32 F407 ZGT6
  *
  ******************************************************************************
  */ 
#include "command.h"
  /**
  * @brief  寻找字符串下一个空格
  * @param  字符串起始位置指针
  * @retval 字符串下一个空格位置的指针
  */
char* find_space(char *str)
{
    while(*str!='\n')
    {
        if(*str==' ')
        {
            return str;
        }
        str++;
    }
    return str-1;
}
  /**
  * @brief  解析子字符串
  * @param  子字符串起始位置指针
  * @retval 无
  */
void assignment(char *str)
{
    switch(*str)
    {
        case 'm': printf("m:%f\n",atof(str+1));break;
        case 'p': printf("p:%f\n",atof(str+1));break;
        default:printf("Error!\n");break;
    }
}
  /**
  * @brief  解析字符串命令解析,命令以字母开头,后面带参数数字,字符串结束符为'\n'
  * @param  字符串起始位置指针
  * @retval 无
  */
void string_translate(char* str)
{

    char *p;
    char buffer[10]; 
    p=find_space(str);
    strncpy(buffer,str,p-str+1); 
    while(*str!='\n')
    {
        p=find_space(str);
        if(p!=str)
        {
        strncpy(buffer,str,p-str+1); 
        assignment(buffer);
    memset(buffer,0, sizeof(buffer));
        str=p+1;
        }
        else
        {
        p++;
        str++;
        }
    }
}

测试结果

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq2331374921/article/details/81979356