四种命令类型
-
: 确认符
-
: 换行符
-
<…>: 参数名称,尖括号不体现在命令行中
-
: 空格符
指令名称 | AT命令语法 | 传入参数 |
---|---|---|
设置 | AT+CMD= | AT_CMD_SET |
执行 | AT+CMD[=] | AT_CMD_EXE |
测试 | AT+CMD==? | AT_CMD_TEST |
查询 | AT+CMD? | AT_CMD_READ |
AT指令的实现
1.在AT命令表中添加AT名称和对应函数
+QWETEST, AT_CmdFunc_QWETEST, SA_CMDCLS_GPRS, 1, AT_CGSMS_PERM
第一个参数为AT指令名,第二个参数为该指令调用的函数
2.根据所需AT功能添加case
VOID AT_CmdFunc_QWETEST(AT_CMD_PARA *pParam)
{
uint8_t ask[10] = {0};
uint8_t buf[100] = {0};
INT32 iResult = 0;
UINT8 uParamCount = 0;
UINT16 uSize;
if (NULL == pParam)
{
AT_CMD_RETURN(at_CmdRespCmeError(pParam->engine, ERR_AT_CME_PARAM_INVALID));
}
switch (pParam->iType)
{
//设置参数,一次获取输入的几个参数进行操作
case AT_CMD_SET:
{
iResult = AT_Util_GetParaCount(pParam->pPara, &uParamCount);
if ((iResult != ERR_SUCCESS) || (uParamCount != 1))
{
AT_CMD_RETURN(at_CmdRespError(pParam->engine));
}
uSize = sizeof(buf);
iResult = AT_Util_GetParaWithRule(pParam->pPara, 0, AT_UTIL_PARA_TYPE_STRING, buf, &uSize);
strcat(buf, "\n");
putout(pParam, buf);
//AT_AsyncWriteUart(pParam->engine, buf, AT_StrLen(buf));
//COS_LOGI(0, "GetParaWithRule, serverIpType=%d", buf);
if (iResult != ERR_SUCCESS)
{
AT_CMD_RETURN(at_CmdRespError(pParam->engine));
}
AT_CMD_RETURN(at_CmdRespOK(pParam->engine));
break;
}
//执行不需要获取参数的命令
case AT_CMD_EXE:
{
//putout(pParam,ask);
strcpy(ask,"test EXE");
at_CmdRespInfoText(pParam->engine, ask);
AT_CMD_RETURN(at_CmdRespOK(pParam->engine));
break;
}
//查询参数范围,
case AT_CMD_TEST:
{
sprintf(buf, "+QWETEST: (0-1)");
at_CmdRespInfoText(pParam->engine, buf);
AT_CMD_RETURN(at_CmdRespOK(pParam->engine));
/*NW_Print("uParamCount = %d\n",uParamCount);
at_CmdRespOK(pParam->engine);*/
break;
}
//查询现在状态
case AT_CMD_READ:
{
sprintf(buf, "+QWETEST READ");
at_CmdRespInfoText(pParam->engine, buf);
//AT_AsyncWriteUart(pParam->engine, "+read ok\n", AT_StrLen("+read ok\n"));
AT_CMD_RETURN(at_CmdRespOK(pParam->engine));
break;
}
default:
{
COS_LOGI(0x1000476c, "QWETEST ERROR");
AT_CMD_RETURN(at_CmdRespCmeError(pParam->engine, ERR_AT_CME_PARAM_INVALID));
}
}
return;
}
AT指令如果一定有需要阻塞的部分 要单独注册一个回调去执行