UART - příjem stringu a jeho rozdělení na číselné hodnoty

Zdravím,

chtěl bych vás poprosit o pomoc při řešení problému. Potřebuji řídit sériovou linkou 6 motorů kdy příkaz z PC vypadá nějak takto A10B20C30D40 atd. kde A je označení motoru a 10 je uhel natočení motoru.
Problém mám s tím že nevím jak takovýto string přijmou jako string a pak ho rozsekat a nalít hodnoty do příslušných proměnných. Díky za nasměrování

:arrow_right: administrator: přejmenováno z "UART - příjem stringu"

ahoj, ideálně v přerušení příjmeš do bufferu znaky, otestuješ si konec (např. nějaký speciální znak) a pak to už jen rozparseruješ. používáš c nebo asm?

Používám C… mohl bych tě poprosit o krátkou ukázku. Rozumím tomu že v přerušení budu příjmat znaky ale už si nevím rady jak je rozsekat. Všechny znaky lezou ASCII, kdyby byly čísla hex tak už bych to zvádl ale nevím jak ASCII 20 převést na číslo 20.

Zkus třeba toto: je to jen momentální nápad, ber ho s rezervou…

unsigned char cislo, pismeno;
unsigned char buf[3];  // v přerušení přijmeš tři byty

// buf[0]  bude cislo 65 "A"
// buf[1]  bude cislo 50 "2"
// buf[2]  bude cislo 48 "0"

pismeno = buf[0];  // prijato "A"
cislo =  (( buf[1] - 48) * 10) + (buf[2] - 48); 

// v promene "cislo" bude hodnota 20

Něco takového mě napadlo ale přišlo mi to strašne složité a věřil sem že by to snad mohlo jít i jednodušeji. Musel bych si udělat tabulku ASCII znaků číslic a poté ho převést na reálné číslo tím převodem co si naznačil.
Druhá možnost tedy je přemluvit programátora programu aby mi udělal výstup v hexa kódu (popřípadě si takový program vytvořit sám). V tom případě by to pak bylo snažší.

Takze pokud sem spravne pochopil jak uart funguje (zkoumal sem to vcera) tak v preruseni dostanu celý řádek ukončený znakem (enter) čili v případě ze dostanu neco jako “A10B20C30D40” tak velikost bude 13 znaků (char buffer[12])

obecně ano, ale buffer si dej větší, může například dojít k chybě komunikace, je třeba s tím počítat.

Tabulku na převod nepotřebuješ - číslice jsou posunuty všechny o konstantní hodnotu, tedy petrův kód bude chodit pro všechny číslice. Jediný, co musíš dodržet, je počet číslic.

Super, takže díky. Číslo bude 3 místný nicméně to nic nemění na způsobu jak dojít k číslici, doufám. :smiley: Všem patří velký dík

Znaků bude 13, tedy “char buffer[13]”.

Aha… já myslel že pole začíná nulou. Sorry, měl bych začít nějakou knížkou. Programovat stylem pokus omyl mě už nebaví. Máte nějaký tip pro AVR. Programuju v různých jazycích takže něco mi až tak cizí není každopádně mi asi unikají všechny detaily.

Ano, pole opravdu začíná indexem 0, ale v deklaraci se zadává počet prvků pole, nikoli poslední index :wink:.

Hmm tak teď je jasné proč některé věci nechodily jak měli. Poradil by si mi nějakou slušnou knihu ?

Sem jakýsi pomýlený. V programu to mám správně.

Nemohu doporučit z vlastní zkušenosti. Velkou část dovedností jsem získal, ač je to neuvěřitelné, ve škole :slight_smile:. Dále něco na builderu (maj tam seriál o C). No a v neposlední řadě ze zdrojů, k nimž bys měl jako registrovaný uživatel přístup. Nicméně v těchto základech by ti měla posloužit jakákoli literatura o C. Pro začátek si projdi seriál na builderu. Pro práci na mcu nevyužiješ všechny kapitoly, takže takový věci jako práce se soubory a konzolí můžeš s čistým svědomím přeskočit.

zkus od herouta programovani v c. to je na nauceni cecka asi nejlepsi knizka co jsem mohl zkouknout. je to sice pro PC, ale zaklady tam pochopis a pak uz muzes s klidem prejit na mikroradice.

dobrá kniha je tahle : ben.cz/_d/obsah/121120o.pdf

jinak na převod ascii řetězce na číslo je standartní C funkce atoi() (ascii to int)a samozřejmě to jde i obráceně : itoa() (int to ascii)

takže: cislo=atoi(“20”); jak jednoduché:D

ale to se samozřejmě dočteš v těch knihách

:arrow_right: administrator: přiloženy externí soubory
121120o.pdf (158 KB)

Samozřejmě ano, jen ten ruční přepočet v tomto případě je mnohem rychlejší a odpadá tam rozsekávání řetězce do dočasných menších pro účely této funkce.
Každý si musí rozhodnout sám so je mu milejší.