ESP8266-从字符串中提取数值的函数

原创 2016年06月01日 15:50:44

由于工作需要,通过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<resLength){
			resData[i] = tempValue;

		}else{
			os_printf("resData is full!\n");
			return false;;
		}

		tempValue = 0;
		os_memset(tempArray, 0, 8);
		data += tempStrLen+1;		//+1跳过逗号
		i++;

	}while(data != NULL || tempValue != 0);

	return true;
}
#undef GETDATA_DEBUG


使用示例:

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]);

该函数修改后可以移植到其他地方。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

不连续数列的最大和、最大连续数列和、最大间隔环

1、问题:求不连续数列的最大和。   2、解释:不连续是指两个数在原始数列中必须是间隔的,比如对原始数列{ 1,2,3,4,5 },其不连续数列的最大和为9,对应的不连续数列为{1,3,5},注意...

【Python】使用Python模拟设备接入阿里云物联网的MQTT服务器

由于阿里云物联网套件关于设备认证的文档不够详细,笔者差不多摸索了几天才连接上MQTT。下面是使用Python模拟设备接入阿里云的MQTT。

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

【ESP8266】基于ESP8266的MicroPython连接MQTT服务器

前言这一篇文章介绍的是使用运行MicroPython的ESP8266去连接MQTT服务器。也算是填了之前的坑。

【ESP8266】基于ESP8266的MicroPython入门笔记

本文是ESP8266运行MicroPython入门笔记,记录自己在探索MicroPython所见所思的同时,也顺便简单评估该开发方式的优缺点。

Linux5 下面iostat的手工安装

刚刚安装好的RED HAT LINUX5,使用中发现没有sar iostat等系统监视命令,man sar也没有,估计是安装操作系统的时候,没有选择完全安装,致使部分命令无法使用,还是手工安装一下...

php join 构造sql查询语句

join() 函数把数组元素组合为一个字符串。join() 函数是 implode() 函数的别名。例子<?php教程$arr = array('hello','world!','beautiful'...

Esp8266 从WiFi连接讲解其中的必备函数

Esp8266 从WiFi连接讲解其中的必备函数 对于关注物联网的同志们,这款芯片并不陌生!然而,对于比较系统的讲解还是较少。对于这款芯片的关注者及测试者,决定对这款芯片做一些系统的讲解。 首先,我...

使用ESP8266的AT指令调用网络数据接口

一、开发环境 网络数据接口平台:www.nowapi.com Wi-Fi模块型号:ESP8266 ESP-01 AT指令集版本:0.40.0.0 SDK版本:1.3.0 二、实验目的使用ESP8266...

基于ESP8266 SDK部分功能的二次封装

一,目的。 使用ESP8266官方提供的固件SDK的人都知道,在大部分的API接口调用和使用逻辑上跟标准C APP开发是有很大差别的,有些功能需要自己花很大时间去进行功能封装和逻辑设计,对于一个精通C...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)