单片机实战:使用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 替代方案