|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2024 10 09, 21:18. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » uart komandų priėmimas
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
Puslapis 1 iš 2 Pereiti prie 1, 2 Toliau |
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 25, 23:33 |
|
|
|
Sveiki,
Norėčiau, kad užvestumėte ant kelio kaip su mikrovaldikliu pasiimti cielas komandas. Kad būtų aiškiau įmetu gabaliuką kodo kurį naudoju dabar, bet esu nepatenkintas veikimu.
Pasiimu iš uart kažkokį tai bufferį s[], toliau:
switch (s[0]){
case 'l':
if ( (s[1]=='a') && (s[2]=='b') && (s[3]=='a') && (s[4]=='s'))
{
sendFString(LABAS);
}
break;
default:
sendFString(ERROR);
break;
Bėda ta, kad jei nusiunčiu į uart pvz. tik laba tai programa tikrina iki a raidės, tada nueina į break ir nieko neįvyksta. Galima būtų panaudoti else, bet gal apskritai yra geresnis būdas pasiimti komandoms negu, kad aš naudoju? |
|
Paskutinį kartą redagavo TomasK, 2014 03 25, 23:52. Redaguota 2 kartus(ų) |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 25, 23:45 |
|
|
|
Nelabai supratau kodėl tu naudoji switch o tau negeriau taip:
Kodas: |
if ((s[0]=='l') && (s[1]=='a') && (s[2]=='b') && (s[3]=='a') && (s[4]=='s')) {
sendFString(LABAS);
}else{
sendFString(ERROR);}
|
|
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 25, 23:50 |
|
|
|
switch todėl, kad gali būti daug komandų, labas kaip pavyzdys tik pateikta, realiai tarkim gali būti adc0, voltage0, temp0 ir pan., su switch pasiimu pirmą raidę ir toliau lyginu sekančios raidelės ar atitinka.
Else galima panaudoti, bet aš galvoju gal apskritai blogą metodą naudoju, gal kas nors užves ant geresnio kelio. |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 25, 23:58 |
|
|
|
Kad būtų aiškiau dėl ko naudoju switch (pavyzdys):
switch (s[0]){
case 'l':
if ( (s[1]=='a') && (s[2]=='b') && (s[3]=='a') && (s[4]=='s'))
{
//kazka veikiam
}
break;
case 'a':
if ( (s[1]=='c') && (s[2]=='i') && (s[3]=='u'))
{
//kazka veikiam
}
break;
default:
//error
break; |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 25, 23:58 |
|
|
|
Na nzn gal kiti pasiūlys ir geresni variantą bet aš tai taip daryčiau:
Kodas: |
if(tikrini labas){ darai ką nori}
else if(tikrini kita){ darai kita}
else if(tikrini ...){ darai ...}
else if(tikrini ...){ darai ...}
else { error } |
|
|
Paskutinį kartą redagavo Master_Of_King, 2014 03 26, 00:01. Redaguota 1 kartą |
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 00:01 |
|
|
|
Tai vat jeigu ta komanda būtų kaip vienetas, o ne raidžių eilutė tai gal ir papraščiau viskas būtų. |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 00:16 |
|
|
|
O tai koks skirtumas ar vienetas ar raidžių masyvas ? ir beto vis tiek tu tam switch'e naudoji if tai kaip ir be reikalingai tas switch
O tau ant laba neišmeta error nes l atitinka o paskui po to yra break ir išmeta lauk o nenueina į error, jei įdėsi į if funkciją break tada tau pakibs ir pastoviai tikrins ta l kuris nebus teisingas, todėl aš galvoju kad čia switch visiškai netinka |
|
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 08:52 |
|
|
|
cia nera jau toks paprastas algoritmas, kaip atrodytu is pirmo zvilgsnio... Pirmas dalykas, tai reikalingas komandos identifikatorius(simboliu runkinys, kad yra komanda). po to kai tas atpazistama, tai priimami komandos simboliai, o komandos simboliu seka lyginama su komandu saraso seka simbolis i simboli... Kai simboliai sutampa didinamas sutapimo rodiklis ir kai jis pasiekia reikiama komanda atpazistama. Geriausia, kai komandos ilgis visoms komandoms yra vienodas. Be to sukuriamas sistemoje buferis i kuri telpa komanda ir is sio buferio simboliai skaitomi ratu kol bus atpazintas komandos headeris... ir t.t.... |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 09:53 |
|
|
|
pasirasai f-ja kuri sulygina buferyje esancia info su perduodamu parametru ir nesuki kiausiu nei sau, nei mums.
drisiu priminti, kad lyginant dar reikia ivertinti kiek tos info yra buferyje. |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 10:29 |
|
|
|
Iseinant is funkcijos as buferi nunulinu tai nesigauna begalinis ciklas.
Šiaip is principo šitas metodas veikia, dar pridedu, kad paskutinį skaičių iš buferio paimtų tai nukreipia automatiškai į adc kanalą reikiamą, tik vienas dalykas kuris nepatinka tai, kad nesuvedus pilnos komandos, o tik pradžią - negaunu klaidos. |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 11:07 |
|
|
|
tam kad gautum klaida kai nesuvesta pilna komanda turetum skaiciuoti laika, skirta komandos priemimui. Jei jis virsijamas-klaida ir buferio isvalymas. |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 12:33 |
|
|
|
O kuo blogas šitoks kodas ?
Kodas: |
if((s[0]=='l') && (s[1]=='a') && (s[2]=='b') && (s[3]=='a') && (s[4]=='s')) {sendFString(LABAS); }
else if((s[0]=='a') && (s[1]=='d') && (s[2]=='c'))) { sendFString(ADC); }
else if((s[0]=='v') && (s[1]=='o') && (s[2]=='l')&& (s[3]=='t')&& (s[4]=='a')&& (s[5]=='g')&& (s[6]=='e')) { sendFString(Voltage); }
else if((s[0]=='t') && (s[1]=='e') && (s[2]=='m')&& (s[3]=='p')) { sendFString(Temp); }
else {sendFString(ERROR);}
|
|
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 13:12 |
|
|
|
Net nežinau kodėl užsiciklinau ant to switch, gal vistik reiks bandyt be jo susidėliot viską, o if`e kreipsiu į atitinkamas funkcijas, kuriose dar papildomai pasiimsiu paskutinį buferio simbolį adc kanalo nustatymui, o funkcijos gale nulinsiu bufferi.
Dėkui už patarimus. |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 13:51 |
|
|
|
tas switch tai nieko blogo Jis tinka. kartais buna daug vaizdesnis ir lengviau skaitomas nei kad kitokie aprasymai. |
|
_________________ Nieko taip lengvai nedaliname, kaip patarimus... |
|
|
|
|
|
uart komandų priėmimas |
Parašytas: 2014 03 26, 15:01 |
|
|
|
kas link pacio programavimo ir i ka kompiliatorius pavers koda, tai algoritmo aiskumo delei ir neprarandant nasumo gali daryti kad ir taip:
Kodas: |
volatile int timeOut = 0;
volatile int bufIndex = 0;
ISR (USART_RXC_vect)
{
char temp = UDR;
if (bufIndex > sizeof(buf))
{
//ERROR
return;
}
timeOut = 0;
buf[bufIndex++] = temp;
}
void clearBuf(void)
{
cli();
while (bufIndex) buf[--bufIndex] = 0;
sei();
}
void testLABAS(void)
{
if (buf[0] != 'L') return;
if (buf[1] != 'A') return;
if (buf[2] != 'B') return;
if (buf[3] != 'A') return;
if (buf[4] != 'S') return;
clearBuf();
// .. tavo veiksmai
}
void testADC(void)
{
if (buf[0] != 'A') return;
if (buf[1] != 'D') return;
if (buf[2] != 'C') return;
clearBuf();
// .. tavo veiksmai
}
void main(void)
{
while (1)
{
if (timeOut < 1000)
{
_delay_ms(1);
timeOut++;
}
else
{
// ERROR
clearBuf();
timeOut = 0;
}
testLABAS();
testADC();
// testXXX();
// testYYY();
}
}
|
|
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods |
|
|
|