Šiais laikais, kai kiniški GPS imtuvai visai atpigo, kilo noras panaudoti juos kaip RTC. Tačiau iškilo paprasčiausia problema- programinė įranga internete arba “arduino” arba “C++” arba velniai žino kokia. O man reikėjo kažko paprasto, grynam AVR GCC. Todėl, pasižvalgant į svetimą softą, iškilo mano NMEA teksto analizatorius. Jo dirbimo rezultatas- struktūra užpildyta duomenim, tuos duomenis galima ir parodyti per COM portą, o galima panaudoti savo programoms.
Mano paprogramės duomenys parodyti raudonai, o baltai matosi duomenys iš GPS imtuvo. Pastabesni žmonės gali surasti kur tuo metu buvo Levas.
Matosi, kad ne visi sakiniai analizuojami- man visiškai neįdomu, kiek ir kur kabo satelitai, ar judėjimo gretis. Nereikalingus sakinius galima išjungti su konfiguracine programa, tačiau čia eina “default” duomenų srautas.
Hardwarė labai paprasta- dvi plokštelės iš kinijos ir keturi laidai: atmega32u4 ir uBlox NEO-6M:
Programinės įrangos source code ir sukompiliuoti failai:
USB serial device on AVR ATMEGA32U4 source code LUFA and NMEA GPS parser for uBlox NEO 6M.
Kažkur matytas civikas
Sveikas,
Gal teko domėtis, kaip pagal tuos RTC duomenis automatiškai pakoreguoti languoto kompo laiką? Manau, tam užtektų GPS imtuvo pajungto prie COM porto ir kažkokio serviso. Bet ant PC apie servisų programavimą visiškai nieko nežinau. Gal teko kažką panašaus kur užmatyti?
Kad tu Civiku pilna:
Čia.
Dėl RTC ir languoto kompo. O koks tikslumas reikalingas? Nes plius-minus sekundė tai paprasta, bet sekundės dalimis tai jau problema- reikia įvertinti serial porto laginimą ir šiaip. Gal papildomai pagal pps signalą dar? Tačiau jau tai rimtesnis softas.
Sveikas, Levai. Ant smugio perziurejau dali kodo, tai serial receive pertrauktyje radau klaida:
if(a > 0x20 || a==0x0A || a==0x0D)
{
rx[rxn++]= a; // SAVE simbol, and POSTincrement rxn
rx[rxn+1]=0; // cia gali iseiti uz buferio ribu…
if(a==0x0A) {rxFlag=1;}// notify main of receipt of data.
}
siulau keisti:
if ( ‘ ‘
Dėl galimo buffer overflow. Yra toks:
#define BUFFER_SIZE 100
char rx[BUFFER_SIZE+2];
ir
if (rxn==BUFFER_SIZE)
Tai kaip ir papildomi 2 baitai rezerve. Aš nežinau kaip rezervuoja GCC stringus, bet rodos dar vienas baitas nuliui automatiškai užsirezervuoja. Bet nepasitikiu, tai užtat +2.
Tiesa, čia buvo copy-paste iš kito projekto, tai gali buti, kad to užnulinimo visiškai nereikia. Kitam projekte buvo kovojama su CR+LF, poto prijungus prie kitos OS, jau ten buvo LF+CR… ir buvo bėda su pabėgusiu ar CR arba LF.
Čia rodos max NMEA ilgis iki 80 baitų…
Dėkui už pastabą.
Papildau, nes nukarpe ka siunciau…
rx[rxn+1]=0; reikia keisti i rx[rxn]=0;
simboli deti i podeli gali jei daugiau lygu SPACE
kitaip jei NL arba CR ir rxn nelygu nuliui tik tada rxFlag=1 ir nereika rxn++ bei talpinimo i podeli.
isvedant eilutes papildai tik NL arba NL+CR
main cikle rxn apnulini ir rxFlag numeti tik atlikes viska kas priklauso…
o del svetimo kodo tai uzjauciu, nes ko tik nepasitaiko interneto platybese.
Beje, rx[rxn]=0; galima ir tik tada, kai rxFlag=1; logiskai viskas ok gausis.
Čia kad ir kitiem skaitytojams aiškiau matytusi:
Buvo:
Gavosi:
Deja, 0A ir oD išmesti negalima, nes tada negražiai rodo ant putty ekrano. Analizei ir mano paprogramei tikrai nereikia CR ir LF kodo.
Sekundės tikslumo pilnai pakanka…
nu tai gal užtektu task scheduler, nuskaityti iš COM porto, poto “time” komanda. Galima kokiam visual basice kogero padaryti GPS NMEA parserį.
O languotam kompe standartinėmis priemonėmis per internetą netinka?
Šiandien per pietus kaiptik apie tai ir galvojau. Va pvz paimti Tavo projektuką, pasikoreguoti, kad duotų tik laiką ir datą ir su komandinės eilutės skriptu pažaisti per shedulerį Aišku reikia tikrinti, ar laikai, datos perdaug nesiskiria nuo esamo, kad paskui dėl blogo priėmimo nepradėtų serverio laikas šokinėti
Standartinės priemonės netinka, nes nėra ir nebus interneto, saugumo sumetimais. Nors jei kokį labai gerą firewal’ą pastačius – galbūt