 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
PrimozL Član


Pridružen-a: Tor 21 Mar 2006 10:55 Prispevkov: 404 Aktiv.: 1.72 Kraj: okolica Vipave
|
Objavljeno: Čet Apr 21, 2011 10:05 pm Naslov sporočila: |
|
|
RUros je napisal/a: |
Tudi jaz sem ta isti modul že priklopil in kaže da dela . Če ti ni odveč ali lahko poveš kako si izvedel povezavo Rx in Tx, si moral prilagoditi nivoje ali si uporabil samo tista upora ? Hvala. |
Živijo,
Pri meni dela GPS modul z NXP ARMom na 3.3V, torej ni težav z nivoji. Če je tvoj mikrokrmilnik 5V, bi uporabil proti GPS upor 1K v serijo, zener diodo 3V3 proti masi in še en upor 330R do vhoda v GPS. V obratni smeri od GPS k uC pa samo upor 330R. Tako vezje preizkušeno deluje tudi na 115K2. Če bi pa prav želel 3.3V izhod iz GPS pretvoriti v 5V, lahko uporabiš npr "single gate" čip. HCT vhodni nivoji na 5V so taki, da jim 3.3V povsem ustreza (stran 6 v PDF-ju).
LP Primož. |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Sre Apr 27, 2011 1:16 pm Naslov sporočila: |
|
|
Pozdrav!
Pri komunikaciji z modulom sem naletel na težavo. Komunikacija sicer dela, ampak ne vem načina, kako iz poslanih paketov razbrati pravega. Se pravi če hočem npr. shraniti samo paket $GPGGA. Kako vedeti kateri je ? Poizkusil sem tako, da gnezdim if stavke, in preverjam vsak znak posebej, ki pride preko UART. Vendar se tu zatakne, ker to ne dela najbolje. Za dva gnezdena if stavka, stvar še dela, potem pa ne več, preko terminala ne dobim nobene povratne informacije (iz AVR-ja si namreč pošiljam nazaj na PC, da vidim kaj sem prejel). Kako ste to težavo rešili vi ?
In pa še eno vprašanje, ki me muči: kako lahko s pomočjo for stavka prebereš nek del stavka ? Namreč ko hočem to storiti, dobim samo enake znake in ni podobno istemu, kar pričakujem. Kaj pri vsem tem delam narobe ? |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Sre Apr 27, 2011 2:58 pm Naslov sporočila: |
|
|
To ni najboljša ideja za sprejem dolgih paketov preko uarta, ker je ta komunikacija precej počasna, pa še, kot si omenil, se rado zatika.
Naredi raje ciklični buffer v katerega loviš znake in obdelaj celoten sprejet paket na enkrat in ne vsak znak posebej.
Potem pa v main zanki spremljaj koliko $ karakterjev imaš v bufferju. Če imaš vsaj 2 pomeni, da imaš vsaj 1 cel paket, ki ga lahko obdelaš.
Paket pa obdelaš tako, da prebereš prebereš komando med $ in prvo vejico....
Če ni paket pravi, greš čakat na naslednji v celoti sprejeti paket. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
PrimozL Član


Pridružen-a: Tor 21 Mar 2006 10:55 Prispevkov: 404 Aktiv.: 1.72 Kraj: okolica Vipave
|
Objavljeno: Sre Apr 27, 2011 4:09 pm Naslov sporočila: |
|
|
RUros je napisal/a: |
Pri komunikaciji z modulom sem naletel na težavo. Komunikacija sicer dela, ampak ne vem načina, kako iz poslanih paketov razbrati pravega. Se pravi če hočem npr. shraniti samo paket $GPGGA. Kako vedeti kateri je ? |
Živijo,
Vsekakor je pametno narediti en avtomat stanj (state machine) in rezervirati vmesni pomnilnik, v katerega vpisuješ znak po znak vsebine sprejetega sporočila.
Moj predlog (že večrat preizkušen):
1.Osnovno stanje je, ko čakaš na začetek paketa. Ko sprejmeš znak '$', greš v stanje sprejema vsebine sporočila.
2. V stanju sprejemanja vsebine sporočila samo še sprejemaš posamezne znake in jih tlačiš v vmesni pomnilnik. Za vse sprejeti znak tudi popraviš kontrolno vsoto. Paziti moraš seveda, da ne greš pri pisanju čez meje pomnilnika, če se kaj zatakne (npr. ne sprejmeš znaka '*', ki označuje konec vsebine sporočila). Če se to zgodi, je nekaj narobe, in greš v stanje 1. Po tem, ko v tem stanju sprejmeš znak '*', greš v naslednje stanje in čakaš prvi znak kontrolne vsote.
3. Ko tega sprejmeš, greš v stanje sprejema drugega znaka kontrolne vsote.
4. Ko tega sprejmeš, preveriš, če je izračunana vsota enaka sprejeti in je torej sporočilo v redu sprejeto, da ga lahko nadalje razkosaš na posamezna polja. Z eno globalno spremenljivko še označiš, da je novo sporočilo na voljo in dokler ni obdelan, ne sprejemaš novih sporočil. Zatem greš v vsakem primeru zopet v stanje čakanja začetnega znaka '$' novega sporočila.
Zgoraj skicirani avtomat stanj je (če je kolikor toliko lepo napisan) tako enostaven in hiter, da ga brez težav daš v prekinitveno rutino, ko ti enkrat zanesljivo deluje v glavnem programu. Vmesni pomnilnik je recimo globalno polje določene velikosti, recimo 128 bytov.
Če so ti druga sporočila odveč, enostavno po sprejemu sporočila preveriš, če je prvih 5 znakov enakih "GPGGA". Če ni, sporočilo zavržeš. Lahko pa seveda znotraj avtomata stanj po prejemu 5 znakov sporočila to preveriš in če ni ustrezno, greš v stanje 1 čakat novo sporočilo.
Brez avtomata stanj si ne predstavljam pisanja rutine za sprejem GPS sporočil (ali katerekoli druge komunikacije).
LP Primož. |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Sre Apr 27, 2011 5:24 pm Naslov sporočila: |
|
|
Najprej sem hotel narediti po kopitu iz tega linka, kar pa ni najbolje, kar sem opisal že zgoraj.
Če bi hotel potem shraniti cel paket in ga nato obdelovati, moram tudi nekako znake shraniti v nek array oz. niz. Tudi to sem poskušal s pomočjo for zanke, ampak se mi zdi, da je UART prepočasen, in da zato dobim same enake znake. Ne vem kako sicer to vi rešujete, ampak programski jezik, v katerem pišem, vsebuje tudi že spisano funkcijo za sprejem celega teksta.
Torej deluje tako, da shrani tekst v niz, do kje pa naj ga shrani pa določa delimiter, ki bi bil tem primeru znak '*'.
S tem ukazom, pa mi uspe prejeti vse pakete pravilno, kar vidim tudi preko terminala na PC-ju. Torej sem praktično že shranil nek paket od '$' do '*'. Kar je tudi namen.
Pri preverjanju vrste paketa se malo zatakne, ker ne vem kako naj primerjam znan niz z neznanim. Npr. ali je ????==GPGGA. Je morda rešitev v tem, da preko for zanke preverjam vsak znak posebej z if stavkom, ki ga zapišem v HEX kodi in ne kot znak, ker če zapišem kot znak, bo vrednost izraza vedno true, ker sta oba tipa, ki se primerjata enaka ?
Sem morda na pravi poti, ali sem začel popolnoma narobe ? |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Sre Apr 27, 2011 5:37 pm Naslov sporočila: |
|
|
kaj pa z že spisanimi funkcijami v c knjižnici?
strncmp Compare characters of two strings (function)
memcmp Compare two blocks of memory (function)
dodaj #include string.h. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
RUros Član


Pridružen-a: Čet 09 Mar 2006 22:26 Prispevkov: 1031 Aktiv.: 4.39
|
Objavljeno: Sre Apr 27, 2011 11:43 pm Naslov sporočila: |
|
|
Matjaž hvala za idejo, sem že poprej pomislil na to, pa se nisem preveč poglabljal v te funkcije. Sem pa do sedaj uspešno rešil sprejem paketa in prepoznave z vašo pomočjo, tako da hvala za nasvete. Uspelo mi je paket nekako sprejeti in shraniti, nato pa pogledati prvih par znakov ali je pravi s funkcijo strcmp.
Sem pa ugotovil, da bi to naredil še hitreje, če me terminal na PC-ju ne bi tako zaj..... Ugotovil sem, da kadar kar zamrzne in pošilja kar naprej iste stare podatke namesto novih . Kakšne programe za gledanje in pošiljanje UART podatkov iz PC pa uporabljate vi ? Bom moral naložiti katerega boljše delujočega . |
|
Nazaj na vrh |
|
 |
tretjic Član

Pridružen-a: Čet 24 Sep 2009 1:19 Prispevkov: 437 Aktiv.: 2.28 Kraj: Postojna
|
Objavljeno: Ned Avg 07, 2011 2:51 pm Naslov sporočila: |
|
|
Imam točno tak GPS, pa mi nikakor ne uspe najti serijskega izhoda.
Sam GPS modul je poleg tega še dobro prekrit/pospajkan s kovinskim oklopom, tako da mi še ni uspelo priti točno do njega (bi rabil 300W spajkalnik ) . Kakšna ideja, kje naj iščem?  |
|
Nazaj na vrh |
|
 |
matjazkariz Član


Pridružen-a: Sre 03 Nov 2004 18:09 Prispevkov: 1026 Aktiv.: 4.33
|
Objavljeno: Ned Avg 07, 2011 3:06 pm Naslov sporočila: |
|
|
Ali v tem produktu obstaja neka nosilna tiskanina, ki povezuje dva ločena modula (GPS in Bluetooth)?
V tem primeru ne bi smelo biti večjih težav. Poglej kakšna sta ta dva modula ter poskusi dobiti UM/datasheet s pinoutom teh modulov.
V kolikor pa je zadeva na eni tiskanini, bo pa treba kar poskušat dobiti pravo linijo. To bo mnogo težje zaradi shielda in rasterja čipovja...
Piši piromanu na ZS, če se ti tu ne oglasi. _________________ LP, Matjaž |
|
Nazaj na vrh |
|
 |
luka1995 Član



Pridružen-a: Sob 17 Apr 2010 21:42 Prispevkov: 614 Aktiv.: 3.33 Kraj: Ljubljana
|
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 494 dni
Powered by phpBB © 2001, 2005 phpBB Group
|