一个AT命令处理小函数

孤街醉人 提交于 2020-02-28 18:43:32

问题描述

对于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);
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!