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