单片机实战:使用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的转换是否成功,成功之后才对业务数据进行处理,这样就不会发生数据失真的问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值