由于工作需要,通过WiFi给ESP8266传送字符串数据时,需要提取字符串里面的数值。
比如字符串:"N000000:550,550,550,550,550,1660,550,550,",需要把N000000后面那些数值用一个整型数组存储起来,特此写了以下函数。
宏定义GETDATA_DEBUG是用来打印信息调试用的。
下面函数的具体功能是给string传递一个字符串的首地址(例如:"550,550,550,550,550,1660,550,550,"),给strip传递分隔符(例如英文逗号:‘,'),给resData传递一个数组首地址,resLength是数组长度。执行完毕后,数值就保存到该数组了。
/*
* 功能:从字符串中提取整型值
* 参数:
* string:字符串
* strip:分隔符
* resData[]:数据结果
* resLength:resData的数组长度
*/
#define GETDATA_DEBUG 0
bool ICACHE_FLASH_ATTR
getDataFromString(const char *string,const u8 strip, u16 resData[], u16 resLength)
{
const char *data = string;
const char *tempStrStart = NULL;
const char *tempStrEnd = NULL;
char tempArray[8] = {0};
u8 tempStrLen = 0;
u16 tempValue = 0;
u8 i = 0;
#if GETDATA_DEBUG
os_printf("\n");
os_printf("resData Size:%d\n",resLength);
#endif
do{
#if GETDATA_DEBUG
os_printf("data:%s\n",data);
#endif
tempStrStart = data;
tempStrEnd = os_strchr(tempStrStart, strip);
if(tempStrEnd == NULL){
//os_printf("tempStrEnd is NULL!\n");
break;
}
tempStrLen = tempStrEnd - tempStrStart;
os_strncpy(tempArray, tempStrStart, tempStrLen);
tempValue = atoi(tempArray);
#if GETDATA_DEBUG
os_printf("tempStrLen:%d\n",tempStrLen);
os_printf("tempArray:%s\n", tempArray);
os_printf("tempValue:%d\n", tempValue);
#endif
if(i
使用示例:
u16 checkData[16] = {0};
char *data = "550,550,550,550,550,1660,550,550,";
getDataFromString(data, ',', checkData, sizeof(checkData)/sizeof(u16));
os_printf("checkData:%d,%d,%d,%d,%d,%d,%d,%d,\n",
checkData[0],checkData[1],checkData[2],checkData[3],
checkData[4],checkData[5],checkData[6],checkData[7]);
该函数修改后可以移植到其他地方。