字符串指令的格式
例子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\nptr = cmdline;cmdName = ptr; //這樣cmdName就是只剩下指令名稱的數組了ptr = strchr(cmdline,' ');if(ptr != 0){*ptr = '\0';//取值改成\0ptr++;}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\nPAL_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