UART način

programski jeziki in programiranje

Moderator: tilz0R

UART način

OdgovorNapisal/-a zanka » 09 Jun 2017, 11:03

Zanimajo me predlogi oziroma dobre prakse, kako sprogramirati UART na uC? Predvsem človeku prijazno.

Naj ima echo odziv? Naj podpira autocomplete? :lol:
Je smiselno gnezdnje ukazov npr.
Koda: Izberi vse
reg set 4
in
Koda: Izberi vse
reg get
?
So presledki nekaj, česar naj ne bi bilo?
Uporabniški avatar
zanka
 
Prispevkov: 1509
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 81 krat
Prejel zahvalo: 137 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 26

Re: UART način

OdgovorNapisal/-a s54mtb » 09 Jun 2017, 11:23

A to misliš command line interpreter (CLI) ?

Nekaj za osnovo za preprost CLI: http://e.pavlin.si/2016/06/20/source-co ... reter-cli/

Sicer pa lahko tudi uporabiš getopt
s54mtb
 
Prispevkov: 7434
Pridružen: 15 Jan 2015, 01:10
Zahvalil se je: 959 krat
Prejel zahvalo: 2358 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 12

Re: UART način

OdgovorNapisal/-a tilz0R » 09 Jun 2017, 11:33

Naj podpira autocomplete?


Za to boš moral poskrbeti na strani iz kjer pošiljaš, predvidevam da PC.

MCU naj le sprejme, kar mu pošlješ in se na podlagi tega odloči kako naprej. Ko dobiš sekvenco stringa ga razdeli na presledke in imaš token-e. Če rabiš literal kot string, ga daj v navednice in ignoriraj token-e presledka znotraj.

Potem skeniraj vsak člen posebej, recimo:

Koda: Izberi vse
if (token[0] == "reg") {
    if (token[1] == "set") {
        set_pin(token[2], 1);
    } else if (token[1] == "get") {
        set_pin(token[2], 0);
    }
}


Seveda je to le pseudo-koda in potrebuje kakšen if-stavek več.
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1324
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 179 krat
Prejel zahvalo: 322 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: UART način

OdgovorNapisal/-a zanka » 09 Jun 2017, 11:46

Črke imam v krožni vrsti (ringbuffer) velikosti 31 (delam AND masking) in ob pritisku na CR ali LF se mi začne program, s katerim bi prebral.

V mislih imam postopek, kjer vzamem prvo črko in se sprehajam po seznamu dokler ne zadanem prve črke, potem ponovim za 2 črko. Seznam bom uredil po abecedi, da bo iskanje prej končano, še vedno pa je to n^2, ampak na 10 ukazih to ne boli preveč. Bolj bi bil primeren kakšen radix-tree, ampak ima preveč balasta s kazalci.

CLI sem že spisal, vendar vzame argc in argv, česar pa si pri majhnih sistemih ne morem privoščiti.

Videl sem, da nekateri vmesniki zagonskih nalagalnikov npr. yamon za mips in uboot izvajajalo CL, torej „print“ znak ponovi ter izvajajo celo autocomplete preko UART (Mikrotik). Nekateri proizvajalci, npr. TASCAM, na RS232C vrnejo isti ukaz, kot ga je uporabnik vnesel. Nekateri ne izpisujejo ničesar, poleg tega pa imajo hiter timeout, zato je vpis možen le strojno ali „makro.“

No, sedajle sem se spomnil. Tudi timeout je pomemben, saj pri komunikaciji lahko pride do težav. Ali pa pač uvedemo backspace. Možnosti je precej, najboljša ni, so pa dobre. No, te dobre me zanimajo.

Zaenkrat mi diši backspace, echo po želji (ukaz za vklop) in primerjanje znak po znak.
Uporabniški avatar
zanka
 
Prispevkov: 1509
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 81 krat
Prejel zahvalo: 137 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 26

Re: UART način

OdgovorNapisal/-a tilz0R » 09 Jun 2017, 11:55

Imaš en array, ki je fiksne dolžine in predstavlja prostor za tvojo komando (celoten string).

Kadar dobiš veljaven znak, dodaš v array in povečaš spremenljivko koliko jih je v array-u.
Če dobiš backspace, zmanjšaš spremenljivko in daš 0 na tisto mesto da zaključiš string.

Ko prejmeš CR ali LF ali podobno, rečeš ok, sedaj je čas za parsanje.

Če je čas med dvema prejetima znakoma recimo več kot 1s rečeš opa, timeout, in resetiraš vse.

Ne razumem kakšen autocomplete bi ti rad imel na MCU-ju. Saj pa ni MCU "master", pač pa ti, ki sediš za PC-jem.

Če hočeš echo, pač pošlješ nazaj string, preden za začneš parsati (po prejetju CR ali LF)
"Words come easy, when they're true!"
Robbie Williams, Gary Barlow
Moj nickname je tilz[NULA]R.
Uporabniški avatar
tilz0R
 
Prispevkov: 1324
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 179 krat
Prejel zahvalo: 322 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: UART način

OdgovorNapisal/-a zanka » 09 Jun 2017, 12:09

Autocomplete je sledeči: če uC dobi ASCII znak 9 (to je TAB), potem zače iskati primeren ukaz in če ga najde, ga uporabniku dopiše, torej dopolni array. Seveda so tudi bolj pretkani, kjer se pomika po večih izbirah, če te so, in brisanje zagrabi na zadnjo črko, ki jo je uporabnik vnesel (linux: ALT+R dela autocomplete po zgodovini)

Odlično, brisanje mi že deluje, sedaj pa naprej.
Uporabniški avatar
zanka
 
Prispevkov: 1509
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 81 krat
Prejel zahvalo: 137 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 26

Re: UART način

OdgovorNapisal/-a sundancer » 09 Jun 2017, 20:22

Poglej si firmata protokol.
Uporabniški avatar
sundancer
 
Prispevkov: 401
Pridružen: 16 Jan 2015, 23:36
Kraj: Domžale
Zahvalil se je: 120 krat
Prejel zahvalo: 195 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 30

Re: UART način

OdgovorNapisal/-a zanka » 10 Jun 2017, 12:28

Zanimiva ta Firmata.

Zaenkrat sem si sprogramiral neke vrste skoraj bisekcijo.
Uporabniški avatar
zanka
 
Prispevkov: 1509
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 81 krat
Prejel zahvalo: 137 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 26


Vrni se na Software

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost