|
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. |