uint32_t GPS_coord_to_degrees(char* s) { char *p, *q; uint8_t deg = 0, min = 0; unsigned int frac_min = 0; uint8_t i; // scan for decimal point or end of field for (p = s; isdigit(*p); p++) ; q = s; // convert degrees while ((p - q) > 2) { if (deg) deg *= 10; deg += DIGIT_TO_VAL(*q++); } // convert minutes while (p > q) { if (min) min *= 10; min += DIGIT_TO_VAL(*q++); } // convert fractional minutes // expect up to four digits, result is in // ten-thousandths of a minute if (*p == '.') { q = p + 1; for (i = 0; i < 4; i++) { frac_min *= 10; if (isdigit(*q)) frac_min += *q++ - '0'; } } return deg * 10000000UL + (min * 1000000UL + frac_min*100UL) / 6; }
u32 GPS_Coord_to_Degrees(char *s) { char *p,*q; u8 deg = 0,min = 0; u32 frac_min = 0; int i; for(p=s;isdigit(*p);p++); //让p指向?ddmm.mmmmm字符串的点 q = s; while((p - q) > 2) //将度(即那个dd喽)提取出来,保存在deg { if(deg) deg*=10; deg += DIGIT_TO_VAL(*q++); } while(p > q) //将那个点前面的分提取出来,即分的整数部分 { if(min) min*=10; min += DIGIT_TO_VAL(*q++); } if(*p == '.') //将分小数部分提取出来 { q = p + 1; for(i = 0;i < 4; i++) { frac_min *= 10; if(isdigit(*q)) frac_min += *q++ - '0'; } } //ddmmmmmmm return deg * 10000000UL + (min * 1000000UL + frac_min * 100UL) / 6;//10000000表示1度,这样分辨率刚好是1cm,虽然这是不精确的 }
static uint32_t GPS_coord_to_degrees(char* s) { char *p, *q; uint32_t deg = 0, min = 0, frac_min = 0, i; for (p = s; isdigit((unsigned char)*p); p++); // scan for decimal point or end of field q = s; while ((p - q) > 2) // convert degrees { if (deg) deg *= 10; deg += DIGIT_TO_VAL(*q++); } while (p > q) // convert minutes { if (min) min *= 10; min += DIGIT_TO_VAL(*q++); } if (*p == '.') // convert fractional minutes expect up to four digits, result is in ten-thousandths of a minute { q = p + 1; for (i = 0; i < 4; i++) { frac_min *= 10; if (isdigit((unsigned char)*q)) frac_min += DIGIT_TO_VAL(*q++); } } return deg * 10000000UL + (min * 1000000UL + frac_min * 100UL) / 6; }
uint32_t AP_GPS_NMEA::_parse_degrees() { char *p, *q; uint8_t deg = 0, min = 0; unsigned int frac_min = 0; int32_t ret = 0; // scan for decimal point or end of field for (p = _term; isdigit(*p); p++) ; q = _term; // convert degrees while ((p - q) > 2) { if (deg) deg *= 10; deg += DIGIT_TO_VAL(*q++); } // convert minutes while (p > q) { if (min) min *= 10; min += DIGIT_TO_VAL(*q++); } // convert fractional minutes // expect up to four digits, result is in // ten-thousandths of a minute if (*p == '.') { q = p + 1; for (int i = 0; i < 5; i++) { frac_min = (int32_t)(frac_min * 10); if (isdigit(*q)) frac_min += *q++ - '0'; } } ret = (int32_t)deg * (int32_t)1000000UL + (int32_t)((min * 100000UL + frac_min) / 6UL); return ret; }
uint32_t GPS_coord_to_degrees(const char* coordinateString) { const char *fieldSeparator, *remainingString; uint8_t degress = 0, minutes = 0; uint16_t fractionalMinutes = 0; uint8_t digitIndex; // scan for decimal point or end of field for (fieldSeparator = coordinateString; isdigit((unsigned char)*fieldSeparator); fieldSeparator++) { if (fieldSeparator >= coordinateString + 15) return 0; // stop potential fail } remainingString = coordinateString; // convert degrees while ((fieldSeparator - remainingString) > 2) { if (degress) degress *= 10; degress += DIGIT_TO_VAL(*remainingString++); } // convert minutes while (fieldSeparator > remainingString) { if (minutes) minutes *= 10; minutes += DIGIT_TO_VAL(*remainingString++); } // convert fractional minutes // expect up to four digits, result is in // ten-thousandths of a minute if (*fieldSeparator == '.') { remainingString = fieldSeparator + 1; for (digitIndex = 0; digitIndex < 4; digitIndex++) { fractionalMinutes *= 10; if (isdigit((unsigned char)*remainingString)) fractionalMinutes += *remainingString++ - '0'; } } return degress * 10000000UL + (minutes * 1000000UL + fractionalMinutes * 100UL) / 6; }