資源簡介
AT命令簡易解析
AT命令的應用場合很多,也是應用最為通用的命令。而AT命令并不像通信協議特定的數據幀格式,解析AT命令需要匹配每個字符。AT命令一般有三種狀態:查詢、執行、設置,根據這三種狀態,本文將使用一種簡易的方法解析AT命令
AT命令的應用場合很多,也是應用最為通用的命令。而AT命令并不像通信協議特定的數據幀格式,解析AT命令需要匹配每個字符。AT命令一般有三種狀態:查詢、執行、設置,根據這三種狀態,本文將使用一種簡易的方法解析AT命令
代碼片段和文件信息
#define?QUERY_CMD 0x01? /*?查詢命令?*/
#define?EXECUTE_CMD 0x02 /*?執行命令?*/
#define?SET_CMD 0x03 /*?設置命令?*/
tyepdef?struct?{
char?*cmd; /*?AT指令?*/
int?(*deal_func)(int?opt?int?argc?char?*argv[]);
}at_cmd_t;
int?deal_uart_func(int?argc?char?*argv[]);
at_cmd_t?at_table[]?=?{
{“AT+UART?“??deal_uart_func}
};
#define?AT_TABLE_SIZE (sizeof(at_table)?/?sizeof(at_cmd_t))
/*
?*?@brief?字符串拆分解析處理?
? AT命令中的多個參數進行字符串參數拆分處理,比如AT+UART=9600081,
? 最后拆分為9600、0、8、1字符串存入argv[]中
?*?@return?檢測歸類的參數個數
?**/
int?string_split(char?*strp?uint32_t?strsize?char?ch?char?*argv[]?uint32_t?argcM?)
{
int?ch_index?=?0;
int?argc_index?=?0;
uint8_t?spliflag?=?0;
if?((!strsize)?||?(!argcM))?return?0;
argv[argc_index++]?=?&strp[ch_index];
for?(ch_index?=?0;?ch_index? if?(strp[ch_index]?==?‘ch‘)?{
strp[ch_index]?=?‘\0‘;
#if?0 /*?處理連續出現ch情況?*/
if?(1?==?splitflag)?{
argv[argc_index++]?=?&strp[ch_index];
}
#endif
splitflag?=?1;
}?else?if?(splitflag?==?1)?{
splitflag?=?0;
argv[argc_index++]?=?&strp[ch_index];
if?(argc_index?>=?argcM)?break;
}?else?{
splitflag?=?0;
}
}
return?argc_index;
}
#define?respond_error() printf(“ERROR\r\n“)
#define?respond_ok() printf(“OK\r\n“);
/*
將接收到AT命令跟列表中的AT指令進行匹對解析,歸類劃分為查詢類型、執行類型、設置類型。
查詢類型:命令后綴為‘?’+‘\r’+’\n’,例如:AT+UART?\r\n.
執行類型:命令后綴只為’\r’+’\n’,例如:AT+UART\r\n.
設置類型:命令‘=’后有多個參數,并以’\r’+’\n’結尾,例如:AT+UART=9600081\r\n
*/
int?at_cmd_parse(uint8_t?*pdata?uint16_t?size)
{
int?ret??=?-1;
char?*ptr?=?NULL;
int?argc?=?ARGC_LIMIT;
uint16_t?offset?=?0;
int?index?=?0;
char?*argv[ARGC_LIMIT]?=?{?(char?*)0?};
if?(strstr((const?char?*)pdata?“AT“)?==?NULL)?goto?at_end;
for?(index?=?0;?in
- 上一篇:聚類技術---復雜網絡社團檢測
- 下一篇:谷粒商場-2020年最新版學習資料.txt
評論
共有 條評論