📄 nmea_8c-source.html
字号:
00131 foundpacket = NMEA_GPGGA;00132 }00133 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(!strncmp(NmeaPacket, <span class="stringliteral">"GPVTG"</span>, 5))00134 {00135 <span class="comment">// process packet of this type</span>00136 nmeaProcessGPVTG(NmeaPacket);00137 <span class="comment">// report packet type</span>00138 foundpacket = NMEA_GPVTG;00139 }00140 }00141 <span class="keywordflow">else</span> <span class="keywordflow">if</span>(rxBuffer-><a class="code" href="structstruct__cBuffer.html#o2">datalength</a> >= rxBuffer-><a class="code" href="structstruct__cBuffer.html#o1">size</a>)00142 {00143 <span class="comment">// if we found no packet, and the buffer is full</span>00144 <span class="comment">// we're logjammed, flush entire buffer</span>00145 <a class="code" href="group__buffer.html#ga7">bufferFlush</a>(rxBuffer);00146 }00147 <span class="keywordflow">return</span> foundpacket;00148 }00149 00150 <span class="keywordtype">void</span> nmeaProcessGPGGA(u08* packet)00151 {00152 u08 i;00153 <span class="keywordtype">char</span>* endptr;00154 <span class="keywordtype">double</span> degrees, minutesfrac;00155 00156 <span class="preprocessor"> #ifdef NMEA_DEBUG_GGA</span>00157 <span class="preprocessor"></span> rprintf(<span class="stringliteral">"NMEA: "</span>);00158 <a class="code" href="group__rprintf.html#ga2">rprintfStr</a>(packet);00159 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00160 <span class="preprocessor"> #endif</span>00161 <span class="preprocessor"></span>00162 <span class="comment">// start parsing just after "GPGGA,"</span>00163 i = 6;00164 <span class="comment">// attempt to reject empty packets right away</span>00165 <span class="keywordflow">if</span>(packet[i]==<span class="charliteral">','</span> && packet[i+1]==<span class="charliteral">','</span>)00166 <span class="keywordflow">return</span>;00167 00168 <span class="comment">// get UTC time [hhmmss.sss]</span>00169 GpsInfo.PosLLA.TimeOfFix.f = strtod(&packet[i], &endptr);00170 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: latitude</span>00171 00172 <span class="comment">// get latitude [ddmm.mmmmm]</span>00173 GpsInfo.PosLLA.lat.f = strtod(&packet[i], &endptr);00174 <span class="comment">// convert to pure degrees [dd.dddd] format</span>00175 minutesfrac = modf(GpsInfo.PosLLA.lat.f/100, &degrees);00176 GpsInfo.PosLLA.lat.f = degrees + (minutesfrac*100)/60;00177 <span class="comment">// convert to radians</span>00178 GpsInfo.PosLLA.lat.f *= (M_PI/180);00179 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: N/S indicator</span>00180 00181 <span class="comment">// correct latitute for N/S</span>00182 <span class="keywordflow">if</span>(packet[i] == <span class="charliteral">'S'</span>) GpsInfo.PosLLA.lat.f = -GpsInfo.PosLLA.lat.f;00183 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: longitude</span>00184 00185 <span class="comment">// get longitude [ddmm.mmmmm]</span>00186 GpsInfo.PosLLA.lon.f = strtod(&packet[i], &endptr);00187 <span class="comment">// convert to pure degrees [dd.dddd] format</span>00188 minutesfrac = modf(GpsInfo.PosLLA.lon.f/100, &degrees);00189 GpsInfo.PosLLA.lon.f = degrees + (minutesfrac*100)/60;00190 <span class="comment">// convert to radians</span>00191 GpsInfo.PosLLA.lon.f *= (M_PI/180);00192 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: E/W indicator</span>00193 00194 <span class="comment">// correct latitute for E/W</span>00195 <span class="keywordflow">if</span>(packet[i] == <span class="charliteral">'W'</span>) GpsInfo.PosLLA.lon.f = -GpsInfo.PosLLA.lon.f;00196 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: position fix status</span>00197 00198 <span class="comment">// position fix status</span>00199 <span class="comment">// 0 = Invalid, 1 = Valid SPS, 2 = Valid DGPS, 3 = Valid PPS</span>00200 <span class="comment">// check for good position fix</span>00201 <span class="keywordflow">if</span>( (packet[i] != <span class="charliteral">'0'</span>) && (packet[i] != <span class="charliteral">','</span>) )00202 GpsInfo.PosLLA.updates++;00203 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: satellites used</span>00204 00205 <span class="comment">// get number of satellites used in GPS solution</span>00206 GpsInfo.numSVs = atoi(&packet[i]);00207 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: HDOP (horizontal dilution of precision)</span>00208 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: altitude</span>00209 00210 <span class="comment">// get altitude (in meters)</span>00211 GpsInfo.PosLLA.alt.f = strtod(&packet[i], &endptr);00212 00213 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: altitude units, always 'M'</span>00214 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: geoid seperation</span>00215 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: seperation units</span>00216 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: DGPS age</span>00217 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: DGPS station ID</span>00218 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">'*'</span>); <span class="comment">// next field: checksum</span>00219 }00220 00221 <span class="keywordtype">void</span> nmeaProcessGPVTG(u08* packet)00222 {00223 u08 i;00224 <span class="keywordtype">char</span>* endptr;00225 00226 <span class="preprocessor"> #ifdef NMEA_DEBUG_VTG</span>00227 <span class="preprocessor"></span> rprintf(<span class="stringliteral">"NMEA: "</span>);00228 <a class="code" href="group__rprintf.html#ga2">rprintfStr</a>(packet);00229 <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();00230 <span class="preprocessor"> #endif</span>00231 <span class="preprocessor"></span>00232 <span class="comment">// start parsing just after "GPVTG,"</span>00233 i = 6;00234 <span class="comment">// attempt to reject empty packets right away</span>00235 <span class="keywordflow">if</span>(packet[i]==<span class="charliteral">','</span> && packet[i+1]==<span class="charliteral">','</span>)00236 <span class="keywordflow">return</span>;00237 00238 <span class="comment">// get course (true north ref) in degrees [ddd.dd]</span>00239 GpsInfo.VelHS.heading.f = strtod(&packet[i], &endptr);00240 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: 'T'</span>00241 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: course (magnetic north)</span>00242 00243 <span class="comment">// get course (magnetic north ref) in degrees [ddd.dd]</span>00244 <span class="comment">//GpsInfo.VelHS.heading.f = strtod(&packet[i], &endptr);</span>00245 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: 'M'</span>00246 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: speed (knots)</span>00247 00248 <span class="comment">// get speed in knots</span>00249 <span class="comment">//GpsInfo.VelHS.speed.f = strtod(&packet[i], &endptr);</span>00250 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: 'N'</span>00251 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: speed (km/h)</span>00252 00253 <span class="comment">// get speed in km/h</span>00254 GpsInfo.VelHS.speed.f = strtod(&packet[i], &endptr);00255 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">','</span>); <span class="comment">// next field: 'K'</span>00256 <span class="keywordflow">while</span>(packet[i++] != <span class="charliteral">'*'</span>); <span class="comment">// next field: checksum</span>00257 00258 GpsInfo.VelHS.updates++;00259 }00260 </pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Oct 24 16:03:55 2005 for Procyon AVRlib by <a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -