OK1UFC

 

Co to je parsing? Musíme umět nějakou techniku parsování, když píšeme program pro CAT nebo CI-V?

Poslední aktualizace 2026   

  

 

Všeobecně

Použití termínu "parsing" na ham stránkách možná překvapí.
Takže:
V české technické terminologii se pro proces parsingu používá několik výrazů v závislosti na tom, jak moc „česky“ chceme znít a v jakém kontextu se pohybujete (akademickém vs. praktickém).
Přehled technicky správných názvů:

1. Syntaktická analýza (Nejformálnější výraz)
Toto je nejpřesnější a nejčastěji používaný termín v učebnicích informatiky a na univerzitách. Samotný "parser" se pak nazývá "syntaktický analyzátor".

2. Parsování (Profesní slang / Standard)
Ačkoliv jde o počeštěný anglicismus, v běžné programátorské praxi je to naprosto akceptovaný a nejrozšířenější termín.
Takže zde uvedu můj (opět vidlácký) příklad: „Musím pořešit parsování bajtů, které mi lezou z rádia Icom.“

 

Parsing v jednoduchém Icom kontroléru

Na obrázku vpravo vidíte ten nejjednodušší kontrolér, který si může kdokoliv napsat sám. Snadno tak odešlete přes rozhraní CI-V a na jedno, dvě kliknutí, příkazy do rádia, které vyberete v jednoduchém menu. Snadno zvolíte pásmo, provedete nastavení ladicího kroku, vypnete/zapnete předzesilovač, nastavíte duplexní offset, apod. Pod menu vidíte celkem 9 řídících prvků (jmenují se NumericUpDown), pomocí kterých můžete zrealizovat přímé nastavení kmitočtu.


 

Přímé nastavení kmitočtu se provede kliknutím na tlačítko "ENTER". Pro všechny uvedené operace jsem žádný parsing nepotřeboval. Situace se však změnila, když jsem potřeboval přidat tlačítko "READ". Potřeboval jsem, aby se po kliknutí na tlačítko READ přečetla nastavená hodnota frekvence na rádiu a aby se zobrazila v devíti prvcích NumericUpDown správná hodnota. A to už bez jednoduchého "parsování" není možné udělat.

Jak funguje komunikace s rádiem Icom?

Icomy mají rozhraní CI-V. Pokud potřebujeme něco z rádia přečíst, pošleme do rádia příkaz, tj. posloupnost bajtů. Rádio Icom tuto posloupnost zopakuje (to mi zamotalo při návrhu parsingu trochu kebuli, protože jsem na toto chování zapomněl) a odpoví v předepsaném formátu.

Příklad komunikace
Zcela nahoře je procedura Sync(), která má jen dva řádky s příkazy. V jednom řádku se připraví povel (Povel_Read_F()) a druhý příkaz povel odešle a přečte odpověď z rádia:

Povel_Read_F():

Z důvodů daných dávnou minulostí jsem byl zvyklý posílat povely jako 11 bajtovou posloupnost. Příkaz, který má přečíst frekvenci displeje má hodnotu (03) a je dosazen do proměnné dbajts(5) = 3. Před a za tímto bajtem jsou povinné bajty preambule, adresy zařízení, adresy kontroléru a bajt s hodnotou (253), který říká, že tam povel pro Icom končí. Ten je na pozici dbajts(6). Další dbajts (7 až 11) obsahují nuly. Řádek Text = "Sync: " + Str(dbajts(17) + .... slouží jen k tomu, abych si při ladění programu zkontroloval, že rádio odpovídá správně.

V odpovědi z rádia, konkrétně v bajtech dbajts(17) až dbajts(21) mám tedy informaci o frekvenci zobrazené na displeji rádia. Tu potřebuji převést (tedy parsovat posloupnost bajtů) a zobrazit v těch zmíněných prvcích NumericUpDown - viz první obrázek.

Parsování
Na "parsování" jsem si musel napsat jednoduchou proceduru, která pracuje s bajty dbajts(17) až dbajts(21). Protože jsem to vymýšlel a psal prvně a ještě jsem u toho hrál karty, tak jsem použil ještě pomocné proměnné a1 až a9. Jasné jsou hodnoty a9 (ta musí být vždy 0) a a1 (ta je jako jediná obsažena v bajtu dbajts(21) a nemusím ji nijak parsovat. Zajímavé jsou hodnoty a2, a4, a6 a a8. Jde o vyšší řád z dvojice čísel (formát Byte). Ten jsem z bajtu vydoloval tak, že jsem ho podělil základem (číslo 16) a použil z toho celou část. Zajímavé jsou i hodnoty a3, a5 a a7. Tam bych měl použít zbytek po dělení. Jenže jsem si u karet (jako neprogramátor) nemohl vzpomenout na správnou instrukci. Tak jsem si na kus papíru poznačil, abych odečetl od hodnoty bajtu násobek základu. Tím mi zůsta zbytek po dělení. Je to vidlácké, profesionální programátor by excelentně zapracoval s úplně jinými příkazy programovacího jazyka. V tom by měl proti mě bezesporu výhodu, protože by určitě znal různé metody parsování a použil by pro daný účel metodu jednoduchou a správnou.

Úskalí

Pokud bych měl napsat, co mě zdrželo při ladění, tak bych snad uvedl skutečnost, že si v manuálech nečtu nijak podrobně a ani si toho už moc nepamatuju. Takže jsem si reakci rádia na příkaz z PC opět vyzkoušel v oblíbeném Hercules terminálu a podíval se, co z rádia leze. A tak jsem přišel snadno i na to, co jsem zapomněl. Tedy na skutečnost, že rádio každý povel zopakuje, pokud mu rozumí, pak ho provede a odešle odpověď. A tak jsem snadno přišel na to, že Icom opakuje i nuly za znakem (FD) konce protokolu a dohledal jsem se bajtů, které nesou požadovanou informaci.

Související témata

1. Rozhraní CI-V a CAT u rádií Yaesu a Icom 
2. Příklad zdrojového kódu řešení kontroléru pro Icom 706 Mk2G a příklad spustitelného programu.

 

 

   TU 73, Mira, ok1ufc