单片机实战:使用sscanf替代atof,解决atof带来的问题

Posted 秦晓宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机实战:使用sscanf替代atof,解决atof带来的问题相关的知识,希望对你有一定的参考价值。

atof转换失败时返回0,导致数据错误,使用sscanf替代

前几天在写一个传感器的采集程序时,经常发现采集的数据为0的情况,单实际数据不是0,经过检查后发现,使用atof有一些转换的问题。

void doTemperatureV3()

#ifdef DEVICE_DEBUG	
	//printf("doTemperatureV3\\r\\n");
#endif
	checkStorageDataDelay(0xffff);
	printMultiSenserRcvCoachForString();

	//Temp = 18.760   Humi = 35.190
	if(multiSenserCoach.len > 0)
	
		if(multiSenserCoach.coach[multiSenserCoach.len-1] == 0x0A && multiSenserCoach.coach[multiSenserCoach.len-2] == 0x0D
		&& multiSenserCoach.coach[0] == 'T' && multiSenserCoach.coach[1] == 'e' && multiSenserCoach.coach[2] == 'm')
		
			float _temperature,_humidity;
			char data[40],data_2[40];	
			char *xdata_2;
			char *xdata = utilStringGetString(multiSenserCoach.coach,"Temp = ","   Humi");			
			memcpy(data,xdata,40);			
			//temperature = atof(data);			
			if(EOF != sscanf(xdata, "%f", &_temperature))
				
				temperature = _temperature;
			
			free(xdata);

			xdata_2 = utilStringGetString(multiSenserCoach.coach,"Humi = ","\\r\\n");	
			memcpy(data_2,xdata_2,40);				
			//humidity  = atof(data_2);	
			if(EOF != sscanf(xdata, "%f", &_humidity))
				
				humidity = _humidity;
						
			free(xdata_2);
#ifdef DEVICE_DEBUG				
			printf("%.2f	 --%.2f\\r\\n",temperature,humidity);	
#endif
		
	
	
	cleanMultiSenserRcvCoach();


如上所示:通过数据截取后的_data在转换时,一旦格式发送了错误,则会将数据转换为0,这样有严重的问题。
使用sscanf替换atof,首先验证sscanf的转换是否成功,成功之后才对业务数据进行处理,这样就不会发生数据失真的问题了。

以上是关于单片机实战:使用sscanf替代atof,解决atof带来的问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言 | 使用 sscanf 提取AT命令返回结果中的有效数据

让 Linux 和 Windows 都满意的 sscanf 替代方案

AT89C51,AT89C52等单片机在Altium的啥库中?

sscanf解析固定形态的字符串

C基础函数的使用

C基础函数的使用