字符串指令集

字符串指令的格式

在这里插入图片描述
例子1就成功发送了指令 例子2就是发送的字符串有误 查询当前位置就会在附加信息中返回当前座位的坐标
在这里插入图片描述
第一个·指令的参数就是闪灯的两个参数 如第一个示例就是10ms On Time 第二个就是Off Time

使用标准库来接收字符串命令

在这里插入图片描述

字符串指令的接收

在这里插入图片描述
因为一个指令就是一行 所以可以调用PAL库的接口 PAL_USART_ReadLine 读取这个字符串指令 首先需要声明一个数组 就把读到的字符指令放到这个字符数组里面 超时值为0因为在进程函数里
预处理
在这里插入图片描述
因为接收到的指令是字符串所以有\r\n 要把这些无用的信息去掉 在c语言中字符串的末尾为\0代表字符串的结束 所以只需要在字符串倒数第二个位置添加字符\0就可以去除掉没用的信息 使用strlen可以得到字符串的长度
数据的解析
在这里插入图片描述
收到指令后把字符串进行解析 分别是指令的名称和后边的两个参数 首先要分隔开然后把对应的数据存储在对应的变量里面
解析指令名称
在这里插入图片描述
第一个函数接口就是查找字符 char*strchr 第一个参数是要查找的字符串数组 第二个是要查找的字符 如果找到了就返回一个指针指向要查找的字符的位置 如果查找不到就返回0 第二个函数接口就是 strcmp把两个字符串进行比较 如果相等就返回0
在这里插入图片描述
首先ptr指向字符串数组的第一个字符 (char * ptr = cmdline) 然后又定义一个指针指向字符串数组的第一个字符 然后ptr = strchr(cmdline,’ ’)就是要查找字符 空格 ‘ ‘ 然后返回一个指针 = ptr 就是ptr指向要查找的字符 空格在这里插入图片描述
在这里插入图片描述
然后再ptr指向的位置写入\0 就得到了指令的名称 在这里插入图片描述
然后把这个字符数组(只剩下指令名称)和两个指令对比 做对应的动作即可在这里插入图片描述
解析指令参数
在这里插入图片描述
第二个函数接口就是 atoi 就是传入一个字符 就返回这个字符对应的数字 当提取玩指令名称后 ptr来到了图中位置 此时ptr指向一个字符 右上角的程序首先声明了两个指针变量 用来接收字符串指令的两个参数 然后第一个指针指向ptr 也就是第一个字符 然后去搜寻剩下字符串的空格 调用函数strchr(ptr,‘ ’ )使得ptr指向剩余的字符串中的空格 ptr位置如图所示
在这里插入图片描述
然后在prt指向的位置写入\0 然后再向后移动
在这里插入图片描述
arg2指向ptr 此时就把指令字符串分为了三个部分 cmdName字符串数组只有指令名称 SetBlinkParam 第二个字符串数组arg1 只有10 第三个字符串数组只有1000
app_cmd.c

#include  "app_cmd.h"
#include  "stm32f10x_pal_usart.h"
#include  <string.h>
#include "app_blinky_led.h"
#include <stdlib.h>

static PalUSART_HandleTypeDef hUSART;


void App_Cmd_Init(void)
{
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
		
		hUSART.Init.BaudRate = 115200;
		hUSART.Init.USARTx = USART3;
		hUSART.Init.USART_WordLength = USART_WordLength_8b;
		hUSART.Init.USART_Parity = USART_Parity_No;
		hUSART.Init.USART_StopBits = USART_StopBits_1;
		hUSART.Init.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
		hUSART.Init.USART_IRQ_PreemptionPriority = 0;
		hUSART.Init.USART_IRQ_SubPriority = 0;
		hUSART.Init.TxBufferSize = 128;
		hUSART.Init.RxBufferSize = 128;
		hUSART.Init.Advanced.LineSeparator = LineSeparator_CRLF;
		PAL_USART_Init(&hUSART);

}
void App_Cmd_Proc(void)
{		
		char *ptr;
		const char*cmdName;//用来存储指令名称
		
		char cmdline [64];
	 if( PAL_USART_ReadLine(&hUSART,cmdline,64,0) > 0)//返回值大于就接收到一行字符串了
	 {
	 
				cmdline[ strlen(cmdline)-2] = '\0';	//预处理 删除行尾的\r\n
				ptr = cmdline;
				cmdName = ptr; //这样cmdName就是只剩下指令名称的数组了
				ptr = strchr(cmdline,' ');
		  
				if(ptr != 0)
				{
						*ptr = '\0';//取值改成\0
						ptr++;
				}
				if(strcmp(cmdName,"SetBlinkParam") ==0 )
				{
						const char *arg1,*arg2;
						//解析第一个参数
					arg1  = ptr;
					ptr = strchr(ptr,' ');
					*ptr = '\0';
					ptr++;
					//解析第二个参数
					arg2 = ptr;
					
					App_BlinkyLED_SetOnTime(atoi(arg1));
					App_BlinkyLED_SetOffTime(atoi(arg2));
					 
					
					//OK\r\n\r\n
					PAL_USART_SendString(&hUSART,"OK\r\n\r\n"); //表示指令执行成功了
				
				} //修改闪灯参数
				else if(strcmp(cmdName,"GetBlinkParam") ==0) 
				{
					//OK\r\nOn=%d,Off=%d\r\n 返回参数
					PAL_USART_Printf(&hUSART, "OK\r\nOn=%d, Off=%d\r\n", App_BlinkyLED_GetOnTime(),App_BlinkyLED_GetOffTime());
					
					App_BlinkyLED_GetOnTime();//获取亮灯时间
					App_BlinkyLED_GetOffTime();//获取灭灯时间
					
				}//获取闪灯参数
				else	//返回错误  ERROR,cmd name not support
				{
					
					PAL_USART_Printf(&hUSART,"ERROR, cmd Name not supported\r\n\r\n");
				
				}
				
				
				 
	 
	 
	 }


}


void USART3_IRQHandler(void)
{
	
		PAL_USART_IRQHandler(&hUSART);
	
}

app_cmd.h

#ifndef  __APP_CMD_H__
#define  __APP_CMD_H__

#include "stm32f10x.h"


void App_Cmd_Init(void);
void App_Cmd_Proc(void);



#endif
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值