单片机实现AT调试命令
实现目的
对于日常开发过程,我们经常需要借助串口调试设备,所以增加调试指令并且易于扩展是有必要的
思路
1、串口使用中断接收用户参数到接收缓冲区,定义0x0d作为结束标志 2、调用命令类型解析回调函数AT_DeviceHandle,对命令消息进行分流,然后进入指令类型解析函数 3、再指令解析函数里面对指令进行分流,分别处理对应的指令以及使用相关参数
关键实现代码
static int OnCfgDebug(uint32_t vp_Type, uint32_t vp_P1, uint32_t vp_P2, uint32_t vp_P3)
{
p_info("info:OnCfgDebug:Type=%d,P1=%d,P2=%d,P3=%d.", vp_Type, vp_P1, vp_P2, vp_P3);
switch(vp_Type)
{
case 1:
{
gTickS = 0;
gTickMs = 0;
StopTimer(1);
gOpenTime = vp_P1;
gCloseTime = vp_P2;
StartTimer(1);
SaveParamToFlash();
p_dbg("OK");
break;
}
default:
p_info("warn:PARAM INVALID!");
break;
}
return 0;
}
static int AT_DeviceHandle(const unsigned char *data_buf)
{
count = 0;
uint32_t i, vl_CmdId, vl_Type, vl_P1, vl_P2, vl_P3;
uint32_t nlen = strlen((const char *)data_buf);
char vl_FormateStr[64];
vl_CmdId = 0;
vl_Type = 0;
vl_P1 = 0;
vl_P2 = 0;
vl_P3 = 0;
if(!strstr((const char *)data_buf, "="))
goto RETURN;
memset(vl_FormateStr, 0, sizeof(vl_FormateStr)/sizeof(vl_FormateStr[0]));
memcpy(vl_FormateStr, "AT+cmdCfg=%d", strlen("AT+cmdCfg=%d"));
for (i = 0; i < nlen; i++)
{
if ((',' == data_buf[i]) && (i < nlen - 1))
memcpy(vl_FormateStr + strlen(vl_FormateStr), ",%d", strlen(",%d"));
}
sscanf((const char *)data_buf, vl_FormateStr, &vl_CmdId,
&vl_Type, &vl_P1, &vl_P2, vl_P3);
memset((char *)data_buf, 0, nlen);
p_dbg("vl_CmdId=%d, vl_Type=%d, vl_P1=%d, vl_P2=%d, vl_P3=%d", vl_CmdId, vl_Type, vl_P1, vl_P2, vl_P3);
if (TIME_CFG_CMD == vl_CmdId)
return OnCfgDebug(vl_Type, vl_P1, vl_P2, vl_P3);
RETURN:
return -1;
}
扩展时候,只需要增加命令类型,以及指令,即可进入对应的switch-case分支进行解析,目前参数支持3个,可以自行扩展
|