字符串指令集
字符串指令的格式
例子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