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