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函数里修改想要的效果
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++;
}
}
}