Stránka 2 z 2
Napsal: 21 lis 2016, 18:38
od jim_h
Díky oběma.
Zatím jsem to zkusil jak psal Atlan, sice jsem se trošku bál, že se mi to stejně nebude přiřazovat do správných proměnných, ale funguje to bezvadně.
To JirkaRCK:
Ten řetězec bude asi do budoucna lepší, ale zatím jsem si na to netroufl. Musím se trošku více podívat na ty konverze a posílání řetězce a pak zase rozebrání. Jak jsem psal, zatím si tím začínám hrát. Měl jsem program, kde se proměnné mění od 0 do 255 s krokem po 10, takže jsem si mohl vybrat číslo, které se tam určitě neobjeví, ale v reálu bych musel použít tu první metodu nebo ten rozklad, kterej se přiznám asi moc nechápu. Možná kdyby jsi měl chvilku a ještě my to lehce osvětlil. I když asi stejně bude lepší naučit se složit ty proměnné do řetězce a pak to zase rozložit, to bude asi více univerzálnější.
Napsal: 21 lis 2016, 19:40
od JirkaRCK
Kód: Vybrat vše
/**** Vysilaci cast ****/
cisloA=25; //promenna A, kterou budeme posilat
cisloB=43; //promenna B, kterou budeme take posilat
//Zde poslu promennou cisloA
//cisloA posunu o 4 bity, tim 4 nizsi zahodim a 4 vyssi posunu na pozici nizsich
//K vysledku operatorem OR pridam hlavicku 0x10 v hexa - 0b00010000 binarne
//Touto hlavickou si znacim, ze ve ctyrech zbyvajicich bitech je prenasena
//Vyznamnejsi cast promenne A. Vysledny byte odeslu.
UDR = ((cisloA >> 4)|(0b00010000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani
//cisloA ma operatorem AND vynulovany 4 vyznamejsi bity, v prave ctverici zbydou mene vyznamne
//4 bity, ktere jsme pred tim neodeslali. Nasledne jim operatorem OR opet
//pridam hlavicku. Pro nizsi bity jsem si zvolil 0x20, tedy 0b00100000
//Opet odeslu UARTem vysledek
UDR = ((cisloA & 0b00001111))|(0b00100000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani
//Pro cisloB by to vypadalo uplne stejne, jen bych mu zvolil jine hlavicky. Treba 0x30 pro vyssi pulku
//a 0x40 pro nizsi pulku:
UDR = ((cisloB >> 4)|(0b00110000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani
UDR = ((cisloB & 0b00001111))|(0b01000000));
while (! (UCSRA & (1 << UDRE))); //Cekam na odeslani
Kód: Vybrat vše
/**** Prijimaci cast ****/
while (! (UCSRA & (1 << RXC))); // Prijmeme prvni byte
RXbyte = UDR;
// S RXbyte provedeme operaci AND s cislem 0xF0. Tim zahodime data (nizsi ctverici) a ziskame (vyssi ctverici) hlavicku.
// Tu nasledne porovname s cislem 0x10 - pokud se mu rovna, prisel nam vyznamejsi byte promenne cisloA a ten ulozime
// do promenne docasna (posunem o 4 bity vlevo se zbavime hlavicky a dostaneme ctverici dat tam, kam patri)
if((RXbyte & 0b11110000) == 0b00010000){
docasna = (RXbyte << 4);
while (! (UCSRA & (1 << RXC))); // Prijmeme druhy byte
RXbyte = UDR; // Nyni mame v promenne RXbyte druhy byte komunikace, ktery nam protistrana zaslala
// S RXbyte provedeme operaci AND s cislem 0xF0, cimz opet odfiltrujeme data a ziskame hlavicku. Tu nasledne porovname
// s cislem 0x20 - pokud se mu rovna, prisel nam byte s nizsi casti promenne cisloA a my se muzeme radovat a slozit vysledek.
if((RXbyte & 0b11110000) == 0b00100000){
cisloA = (docasna | (RXbyte & 0x0F)); // cisloA je rovno docasne co obsahuje vyssi bity promenne a 4 nuly slozene ORem s nizsi
// casti RXbyte, ktera obsahuje naopak 4 nuly a nizsi bity. AND nas zbavuje hlavicky
// - vyssi bity co k datum nepatri nahrazuje nulama
docasna = 0; // docasnou po sobe radeji nastavime na nulu, aby nas pozdeji nenapalila
}
//ELSE - pokud prvni byte je vyssi cast cisloA, ale druhy byte neni nizsi cast, ale neco jineho - Napriklad doslo k chybe komunikace.
else{
docasna = 0; // Vynulujeme po sobe docasnou a promennou cisloA nechame byt. Cekame na novy RX byte.
}
} // Konec vnejsiho ifu - toho co ceka na prvni prijaty byte
// Prijem promenne cisloB je naprosto totozny, jen neukladame do cisloA, ale do cisloB, a v obou ifech upravime prislusne hlavicky.
// Dle prikladu TX nahradime v tomto pripade 0x10 za 0x30 a 0x20 za 0x40.
// Zamerne kombinuji hexa a bin zapis cisel. Hexa jsou prehlednejsi, ale nejsem si jisty, zda je znas, tak jen, abych je dostal do povedomi
// a pripadne te donutil k vzajemne konverzi :-)
Napsal: 21 lis 2016, 21:08
od jim_h
Super návod, teď už to chápu úplně. Je to určitě lepší způsob než jsem zkoušel, jelikož jsem posílal jeden byte jako identifikátor a pak jsem doufal, že odchytím následující tři po sobě jdoucí bajty, takže jsem neměl žádnou kontrolu, navíc ten identifikátor, jak jsi psal, znemožňuje použít celej rozsah. S tímto řešením mám větší kontrolu, že přichází chtěná proměnná a navíc není problém s rozsahem a dá se to rozšířit na větší čísla. Tahle když to vidím, tak mi to přijde i jednoduché, ale sám bych to nedal. Ještě jednou díky za napsání kodu.