<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=19758&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-10T23:09:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19758&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-12-10T23:09:52+01:00</updated>
<published>2017-12-10T23:09:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200329#p200329</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200329#p200329"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200329#p200329"><![CDATA[
<div class="quotetitle">wojtekr51 napisał(a):</div><div class="quotecontent"><br />A tu implementacja funkcji która zastępuje strtok().<br /></div><br />Tyle, że no ona nie do końca zastępuje strtok - w ogóle nie ma wyboru rodzaju separatora. Separatorem jest na sztywno pojedynczy znak przecinka. Polecam się zainteresować funkcją, którą pokazałem wyżej bo ta rzeczywiście zastępuje strtok - 1:1<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 gru 2017, o 23:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-12-10T23:07:13+01:00</updated>
<published>2017-12-10T23:07:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200328#p200328</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200328#p200328"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200328#p200328"><![CDATA[
Wrzucam fragment biblioteki gdzie parsuję sentencję GPGGA.<br /><br />[syntax=c]/*------------------------------------------------------------------------------------------------------<br />Parse GGA sentence<br />       1         2       3 4        5 6 7  8   9  10 11 12 13  14<br />       |         |       | |        | | |  |   |   | |   | |   |<br />$GPGGA,hhmmss.ss,llll.ll,a,yyyyy.yy,a,x,xx,x.x,x.x,M,x.x,M,x.x,xxxx*hh&lt;CR&gt;&lt;LF&gt;<br /><br />1) Time (UTC)<br />2) Latitude<br />3) N or S (North or South)<br />4) Longitude<br />5) E or W (East or West)<br />6) GPS Quality Indicator,<br />0 - fix not available,<br />1 - GPS fix,<br />2 - Differential GPS fix<br />6 - Estimated/Dead Reckoning<br />7) Number of satellites in view, 00 - 12<br />8) Horizontal Dilution of precision<br />9) Antenna Altitude above/below mean-sea-level (geoid)<br />10) Units of antenna altitude, meters<br />11) Geoidal separation, the difference between the WGS-84 earth ellipsoid and<br />mean-sea-level (geoid), &quot;-&quot; means mean-sea-level below ellipsoid<br />12) Units of geoidal separation, meters<br />13) Age of differential GPS data, time in seconds since last SC104<br />type 1 or 9 update, null field when DGPS is not used<br />14) Differential reference station ID, 0000-1023<br />------------------------------------------------------------------------------------------------------*/<br />void ParseGPGGA(char *data_str, T_GPS_DATA *data)<br />{<br />char *field, *ptr;<br /><br />/* 1 UTC */<br />/*<br /> * h h m m s s . s s<br /> * field idx:0 1 2 3 4 5 6 7 8<br /> */<br />field = GetSentenceDataField(data_str);<br />if( field &amp;&amp; *field ) {<br />data-&gt;UTC_hund_sec = atoi(field + 7);<br />field&#91;6&#93; = '\0';<br />data-&gt;UTC_sec = atoi(field + 4);<br />field&#91;4&#93; = '\0';<br />data-&gt;UTC_min = atoi(field + 2);<br />field&#91;2&#93; = '\0';<br />data-&gt;UTC_hour = atoi(field);<br />}<br />else {<br />data-&gt;UTC_hour = GPS_UTC_INVALID;<br />data-&gt;UTC_min = GPS_UTC_INVALID;<br />data-&gt;UTC_sec = GPS_UTC_INVALID;<br />data-&gt;UTC_hund_sec = GPS_UTC_INVALID;<br />}<br /><br />/* 2 Latitude */<br />/*<br /> * d d m m . m m m m m<br /> * field idx:0 1 2 3 4 5 6 7 8 9<br /> */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; *field ) {<br />ptr = strchr(field, '.');<br />if(ptr - 2 &gt; field){<br />data-&gt;Latitude = atof(ptr - 2) / 60.0;<br />*(ptr - 2) = '\0';<br />data-&gt;Latitude += atof(field);<br />}<br />else data-&gt;Latitude = GPS_LATITUDE_INVALID;<br />}<br />else data-&gt;Latitude = GPS_LATITUDE_INVALID;<br /><br />/* 3 Latitude indicator N/S */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; (*field == 'S' || *field == 'N') ) {<br />if(*field == 'S' &amp;&amp; data-&gt;Latitude != GPS_LATITUDE_INVALID)<br />data-&gt;Latitude = -data-&gt;Latitude;<br />}<br />else data-&gt;Latitude = GPS_LATITUDE_INVALID;<br /><br />/* 4 Longitude */<br />/*<br /> * d d d m m . m m m m m<br /> * field idx:0 1 2 3 4 5 6 7 8 9 10<br /> */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; *field ) {<br />ptr = strchr(field, '.');<br />if(ptr - 2 &gt; field){<br />data-&gt;Longitude = atof(ptr - 2) / 60.0;<br />*(ptr - 2) = '\0';<br />data-&gt;Longitude += atof(field);<br />}<br />else data-&gt;Longitude = GPS_LONGITUDE_INVALID;<br />}<br />else data-&gt;Longitude = GPS_LONGITUDE_INVALID;<br /><br />/* 5 Longitude indicator E/W */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; (*field == 'E' || *field == 'W') ) {<br />if(*field == 'W' &amp;&amp; data-&gt;Longitude != GPS_LONGITUDE_INVALID)<br />data-&gt;Longitude = -data-&gt;Longitude;<br />}<br />else data-&gt;Longitude = GPS_LONGITUDE_INVALID;<br /><br />/* 6 Signal Status (NMEA version 2.3) */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; (*field == '1' || *field == '2') ) data-&gt;SignalStatus = FIX_POSITION;<br />else if(data-&gt;UTC_hour != GPS_UTC_INVALID) data-&gt;SignalStatus = FIX_TIME_ONLY;<br />else data-&gt;SignalStatus = INVALID;<br /><br />/* 7 Satelites use */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; *field ) data-&gt;SatelitesUse = atoi(field);<br />else data-&gt;SatelitesUse = 0;<br /><br />/* 8 HDOP */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; *field ) data-&gt;HDOP = atof(field);<br />else data-&gt;HDOP = GPS_HDOP_INVALID;<br /><br />/* 9 Altitude */<br />field = GetSentenceDataField(NULL);<br />if( field &amp;&amp; *field ) data-&gt;Altitude = atof(field);<br />else data-&gt;Altitude = GPS_ALTITUDE_INVALID;<br /><br /><br /><br />}[/syntax]<br /><br />A tu implementacja funkcji która zastępuje strtok().<br />[syntax=c]/*-------------------------------------------------------------------------------------------------------------------<br /> * Funkcja do podziału string na pola odzielone separatorami (podobnie działa funkcja strtok).<br /> * Pierwsze wywołanie funkcji z podaniem stringa, kolejne wywołania z argumentem NULL.<br /> * Z każdym wywołaniem zwraca adres stringa kolejnego pola danych, gdy pola się skończą zwraca NULL.<br /> * String podany jako argument zostanie zmodyfikowany, w miejsce separatorów ',' wstawia znak końca stringa '\0'.<br /> *-----------------------------------------------------------------------------------------------------------------*/<br />char *GetSentenceDataField(char *SentenceDataStr)<br />{<br />static char *NextField;<br />char *Field, *ptr;<br /><br />if(SentenceDataStr) Field = SentenceDataStr;<br />else Field = NextField;<br /><br />if(Field){<br />ptr = strchr(Field, ',');<br />if(ptr) *ptr = '\0', NextField = ptr + 1;<br />else NextField = NULL;<br />}<br />return Field;<br />}[/syntax]<br /><br />Funkcja mirka jest bardziej uniwersalna. Moją funkcję pisałem specjalnie na potrzeby parsowania NMEA.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 10 gru 2017, o 23:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kuba]]></name></author>
<updated>2017-12-10T21:06:26+01:00</updated>
<published>2017-12-10T21:06:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200319#p200319</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200319#p200319"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200319#p200319"><![CDATA[
Funkcja by była dobra ale potrzebowałbym widziec ja jej uzyć bo chyba nic nie wymyśle.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1439">kuba</a> — 10 gru 2017, o 21:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-12-10T00:14:07+01:00</updated>
<published>2017-12-10T00:14:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200287#p200287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200287#p200287"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200287#p200287"><![CDATA[
W Yellowbooku <br /><br /><!-- m --><a class="postlink" href="http://atnel.pl/wkuwamy-c-majsterkuj.html" >http://atnel.pl/wkuwamy-c-majsterkuj.html</a><!-- m --><br /><br />pokazywałem taką funkcję i inne różnie ciekawostki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]// własna implementacja funckcji strtok, która różni się od oryginalnej tym<br />// że możliwe jest wystąpienie dwóch separatorów w analizowanym stringu jeden po drugim.<br />// Przykład stringa z pustym tokenem, którego nie obsłuży strtok() z separatorami w postaci przecinka<br />// &quot;token1,token2,,token4&quot;<br />// niestety strtok() źle zadzaiła w takim przypadku<br />// natomiast nasza własna implementacja będzie działać poprawnie i wskaźnik na trzeci token<br />// będzie wskazywał na pusty łańcuch czyli na wartość = 0 (koniec stringa NULL) i dalej można parsować<br />char * strtok_mk(char * str, char const * delims) {<br />  static char  * src = NULL;<br />  char  *  p,  * ret = 0;<br /><br />  if (str != NULL)<br />    src = str;<br />  if (src == NULL)<br />    return NULL;<br />  if ((p = strpbrk (src, delims)) != NULL) {<br />    *p  = 0;<br />    ret = src;<br />    src = ++p;<br />  } else if (*src) {<br />    ret = src;<br />    src = NULL;<br />  }<br />  return ret;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 gru 2017, o 00:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wojtekr51]]></name></author>
<updated>2017-12-09T23:59:22+01:00</updated>
<published>2017-12-09T23:59:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200286#p200286</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200286#p200286"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200286#p200286"><![CDATA[
Problemem jest to że funkcja strtok_r() której używasz, w przypadku gdy pola danych pomiędzy separatorami &quot;,&quot; są puste, nie działa w taki sposób jak założyłeś. Gdy w zdaniu występują przecinki obok siebie to owa funkcja potraktuje te wszystkie przecinki tak jakby był tylko jeden przecinek. Też kiedyś miałem taki sam problem z tą funkcją. Rozwiązałem to poprzez napisanie własnej funkcji która działa podobnie do strtok() i wykrywa wszystkie pola nawet gdy ich nie ma <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Możesz pokombinować z napisaniem własnej funkcyjki, a jak chcesz to wrzucę tu moje rozwiązanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1760">wojtekr51</a> — 9 gru 2017, o 23:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kuba]]></name></author>
<updated>2017-12-09T23:00:39+01:00</updated>
<published>2017-12-09T23:00:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200283#p200283</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200283#p200283"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200283#p200283"><![CDATA[
Zrobiłem coś takiego i działa ale jak nie nadlecą wszystkie dane to mi się wyświetla suma kontrolna.Co z tym można zrobić ?<br />[syntax=c]void parse_UART(char * pBuf) {<br /><br />    char * buf;<br />    char * reszta;<br /><br />    buf = strtok_r(pBuf,&quot;,&quot;,&amp;reszta);<br /><br />    if (buf &amp;&amp; (strcmp(buf,&quot;$GPGGA&quot;)==0)){<br /><br />    buf = strtok_r(NULL,&quot;,&quot;,&amp;reszta);<br />        uart_puts(&quot;time:  &quot;);<br />    uart_puts(buf);<br />    uart_puts(&quot;\r\n&quot;);<br /><br />    buf = strtok_r(NULL,&quot;,&quot;,&amp;reszta);<br />    uart_puts(&quot;width:   &quot;);<br />    uart_puts(buf);<br />    buf = strtok_r(NULL,&quot;,&quot;,&amp;reszta);<br />    uart_puts(&quot; &quot;);<br />    uart_puts(buf);<br />    uart_puts(&quot;\r\n&quot;);<br /><br />    buf = strtok_r(NULL,&quot;,&quot;,&amp;reszta);<br />    uart_puts(&quot;length:  &quot;);<br />    uart_puts(buf);<br />    buf = strtok_r(NULL,&quot;,&quot;,&amp;reszta);<br />    uart_puts(&quot; &quot;);<br />    uart_puts(buf);<br />    uart_puts(&quot;\r\n&quot;);<br /><br />    }<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1439">kuba</a> — 9 gru 2017, o 23:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kuba]]></name></author>
<updated>2017-12-07T21:08:22+01:00</updated>
<published>2017-12-07T21:08:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200162#p200162</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200162#p200162"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200162#p200162"><![CDATA[
Coś takiego próbuje ale zadziała to i na inne zdanie<br /><br />[syntax=c]void parse_UART(char * buf) {<br /><br />lcd_locate(0,0);<br />lcd_str(buf);<br /><br />if ( strpbrk(buf, &quot;$GPGGA&quot;)){<br />PORTA ^= (1&lt;&lt;PA7);<br />        lcd_locate(1,0);<br />        lcd_str(buf);<br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1439">kuba</a> — 7 gru 2017, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Ognisty]]></name></author>
<updated>2017-12-07T01:03:42+01:00</updated>
<published>2017-12-07T01:03:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200125#p200125</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200125#p200125"/>
<title type="html"><![CDATA[Re: Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200125#p200125"><![CDATA[
O parsowaniu danych z GPS tutaj było:<br /><a href="http://forum.atnel.pl/topic11972.html"  class="postlink">http://forum.atnel.pl/topic11972.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7053">Ognisty</a> — 7 gru 2017, o 01:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kuba]]></name></author>
<updated>2017-12-07T00:23:02+01:00</updated>
<published>2017-12-07T00:23:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200123#p200123</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200123#p200123"/>
<title type="html"><![CDATA[Parsowanie NMEA]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19758&amp;p=200123#p200123"><![CDATA[
Witam <br />Jakim sposobem parsować tyle dużo danych z GPS.<br />$GPGGA,,,,,,0,00,99.99,,,,,,*48<br />$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30<br />$GPGSV,4,1,13,01,,,24,05,,,21,08,,,22,10,,,25*71<br />$GPGSV,4,2,13,14,,,23,15,,,22,16,,,20,21,,,21*78<br />$GPGSV,4,3,13,23,,,24,26,,,23,27,,,23,28,,,26*74<br />$GPGSV,4,4,13,29,,,22*70<br />$GPGLL,,,,,,V,N*64<br />$GPRMC,,V,,,,,,,,,,N*53<br />$GPVTG,,,,,,,,,N*30<br /><br />Mie interesuje $GPGGA jak to zdanie rozpoznać z pomiendzy ostatnich i ułożyć do bufora?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1439">kuba</a> — 7 gru 2017, o 00:23</p><hr />
]]></content>
</entry>
</feed>