问题描述
对于AT命令的回复,是一个字符串,如果处理该字符串,每次收到字符串都处理一次非常的麻烦,写一个函数来处理AT命令,能大大减少这种麻烦。
函数
/*
* 取两个分隔符之间的子串
* str 原始字符串
* separator1 第一个分隔符
* separator2 第二个分隔符
* num 字符串出现几次时,作为第一个分隔符的位置。
* substr 取出的两个分隔符间的子串,从0起数。"+QMTRECV: 0,0,"Hello",hello world"
*/
uint8_t get_sub_str(char * str,char * separator1,char * separator2,int8_t num, char * substr)
{
int8_t i;
char *p1,*p2;
p1 = str;
for(i = 0; i<=num; i++) {
p1 = strstr(p1,separator1);
if(p1 == NULL) return 1;
p1++;
}
p2 = strstr(p1,separator2);
if(p2 == NULL) return 2;
memcpy(substr,p1,p2-p1);
return 0;
}
将AT命令返回的字符串赋给str,取两个分隔符之间的子串,将该子串放到substr中返回,num是从第几个该分隔符开始取,可以减下边例子。
使用例子解析
例如收到如下的一个字符串:
"+QMTRECV: 0,0,"Hello",hello world"
char conn_id[3]={0},msg_id[3] = {0},topic[100]={0},data[256]={0};
下:从第0个冒号开始取,去冒号和,号之间的子串,就是链接id。get_sub_str((char *)dataPtr,": ",",",0,conn_id);
下:从第0个逗号开始取,取到下一个逗号,就是msg id。get_sub_str((char *)dataPtr,",",",",0,msg_id);
下:取第一个逗号,和下一个逗号之间的内容就是topic。get_sub_str((char *)dataPtr,",",",",1,topic);
下:取逗号和换行符之间的字符,就是data的内容。get_sub_str((char *)dataPtr,",","\r\n",2,data);
下:最后将字符串划分开取到的子串内容打印出来。
printf("conn_id:%s,msg_id:%s,topic:%s,
data:%s\r\n",conn_id,msg_id,topic,data);
来源:CSDN
作者:心无旁骛 努力向前
链接:https://blog.csdn.net/networkhunter/article/details/104556976