Komunikace radiostanice Anytone D878UV2+ s počítačem
Komunikaci radiostanice s počítačem můžeme rozdělit na dvě části. Obecný protokol pro přenos dat specifikuje, jak navázat spojení, přenášet data oběma směry a ukončit spojení. Druhou složitější částí je popis toho, co a na jaké adresy je potřeba zapsat, aby radiostanice uznala přijatá data za platná a začala je používat. Při studiu jsem se inspiroval informacemi ze dvou zdrojů. Jednak projektem qdmr od Hannese Matuscheka, kde je vytvořena základní kopie originálního programu CPS pro systém linux. Bohužel zdaleka neobsahuje všechy možnosti originálního programu CPS, například práci s digitálním seznamem kontaktů (stav k 9.3.2025). Druhým zdrojem jsou informace shromážděné Jasonem Reillym VK7ZJA (NQ4T), přesněji tato webová stránka.
Radiostanice se propojuje s počítačem pomocí programovacího kabelu. Ten koupíte společně s vysílačkou v jejím příslušenství. Kdo ho ztratil nebo poškodil a nechce shánět nový, může si ho sám vyrobit podle obrázku na webu Jasona Reillyho. Je to jednoduché. Jedná se pouze o čistě drátové propojení jack3.5 + jack2.5 s konektorem USB-A. Po připojení radiostanice k počítači nejlépe s Win10 nebo Win11 se automaticky nainstaluje ovladač. Tento ovladač přemění fyzický USB port na virtuální sériový. Takže z programátorského pohledu se jedná o komunikaci po RS232. K tomu jsou potřeba následující parametry:
- Přenosová rychlost: 115200 baud
- DataBits: 8
- Parity: None
- StopBits: 1
1) Zahájení komunikace
Komunikaci vždy zahajuje počítač, přesněji řečeno uživatelský program v něm. Radiostanice vždy jen odpovídá. To znamená, že v programátorské hantýrce je počítač tzv "Master" a radiostanice je tzv "Slave". Tedy není potřeba asynchronní styl programování, protože radiostanice nikdy sama od sebe žádná data neposílá.
Komunikace je zahájena tak, že počítač pošle do radiostanice textový řetězec "PROGRAM". Binárně se jedná o sérii hexadecimálních čísel (bajtů) $50, $52, $4F, $47, $52, $41, $4D
. Radiostanice odpoví třemi bajty $51, $58, $06
. To je potvrzení, že došlo k přepnutí zařízení do komunikačního režimu. Na displeji vysílačky se objeví nápis PC MODE. Dalším povinným krokem je odeslání čísla $02
do radiostanice. Na tento příkaz radiostanice odpoví svým názvem a verzí. Pro radiostanici Anytone D878UV2+ to jsou dva textové řetězce "ID878UV2" a "V101" ukončené nulou. Za nini jsou ještě číslice 0 a 6. Celá série odeslaných hexadecimálních bajtů vypadá takto: $49, $44, $38, $37, $38, $55, $56, $32, $00, $56, $31, $30, $31, $00, $00, $06
. Tento začátek je z pohledu následující komunikace vlastně nestandardní, protože nedodržuje předepsanou strukturu paketů.
2) Přenos užitečných dat
Vlastní přenos dat už probíhá pomocí paketů s přesně definovaným složením. Paket pro čtení dat vypadá následovně: $52, $02, $FA, $00, $20, $10
. Význam této konkrétní série bajtů je následující:
- $52: písmeno "R" jako Read, příznak čtení. Z pohledu počítače chceme data číst ze sériového portu.
- $02, $FA, $00, $20: počáteční adresa, od které se bude číst, tedy $02FA0020
- $10: počet čtených bajtů, hexadecimální číslo $10 znamená desítkově 16
16 je obvyklý počet čtených / zapisovaných bajtů v jednom příkazu. Lze použít i jiný počet, třeba 256, a funguje to. Ale originální program CPS používá pro veškerou komunikaci pakety pouze s délkou užitečných dat 16 bajtů. Na tento požadavek o data radiostanice odpoví následujícím řetězcem bajtů: $57 $02 $FA $00 $20 $10 $FF $FF $FF $FF $FF $FF $FF $FF $00 $00 $00 $00 $00 $00 $00 $00 $24 $06
. Význam této konkrétní série bajtů je následující:
- $57: Písmeno "W" jako Write, příznak zápisu. Z pohledu vysílačky se budou data zapisovat do sériového portu
- $02 $FA $00 $20: pro kontrolu zopakuje požadovanou adresu, tedy $02FA0020
- $10: počet bajtů, které bude posílat, tedy požadovaných $10 = desítkově 16
- $FF $FF $FF $FF $FF $FF $FF $FF $00 $00 $00 $00 $00 $00 $00 $00: požadovaná data
- $24: kontrolní součet CRC
- $06: příznak ukončení přenosu dat
Tím je jedna komunikační transakce kompletní. A může začít další.
Paket pro zápis dat vypadá následovně: $57, $05, $50, $01, $30, $10, $37, $30, $41, $51, $00, $43, $5a, $00, $00, $00, $04, $46, $00, $06, $00, $4d, $c9, $06
. Význam této konkrétní série bajtů je následující:
- $57: Písmeno "W" jako Write, příznak zápisu. Z pohledu počítače chceme data zapisovat do sériového portu.
- $05, $50, $01, $30: počáteční adresa, od které chceme zapisovat, tedy $05500130
- $10: počet zapisovaných bajtů, desítkově 16
- $37, $30, $41, $51, $00, $43, $5A, $00, $00, $00, $04, $46, $00, $06, $00, $4D: data určená k zápisu
- $C9: kontrolní součet CRC
- $06: příznak ukončení přenosu dat
Na tento paket vysílačka odpoví odesláním bajtu $06
. To je potvrzení, že data ze sériového portu byla přečtena bez chyb, tedy se správným kontrolním součtem CRC.
Kontrolní součet CRC se vypočítá tak, že se sečtou všechny bajty před ním bez úvodního znaku "R" nebo "W". Výsledek je obvykle větší, než jeden bajt. Proto se z vypočítaného čísla použije pouze bajt na nejnižší pozici. Například u výše uvedeného zápisu vyjde kontrolní součet $2C9. Jako platný CRC se použije bajt $C9. Pro čtení dat se generuje CRC stejným způsobem, jen ho počítá vysílačka před odesláním do sériového portu. Po přijetí dat si v našem programu můžeme CRC přepočítat a tím zkontrolovat, jestli datový přenos proběhl bez chyb.
3) Ukončení komunikace
Čtecí a zapisovací pakety se mohou libovolně střídat. Nezáleží ani na jejich počtu, ani na délce časových mezer mezi nimi. Dokud náš program neohlásí konec komunikace, vysílačka monitoruje sériový port a na příchozí pakety reaguje výše popsaným způsobem. Pokud chceme komunikaci ukončit, pošleme do radiostanice textový řetězec "END". Binárně se jedná o sérii bajtů $45, $4E, $44
. Radiostanice odpoví bajtem $06
. Následně se radiostanice zachová podle svého nastavení tak, jako by byla právě zapnutá. Obvykle je to proces "Reboot".
Kompletní výpis komunikace by mohl vypadat například takto:
< 50524F4752414D
> 515806
< 02
> 49443837385556320056313031000006
============================================
< 52 02FA0020 10
> 57 02FA0020 10 FFFFFFFFFFFFFFFF0000000000000000 24 06
< 57 04000000 10 53068C0800000000FFFFFFFFFFFFFFFF F9 06
> 06
< 57 04840000 10 01000000280050050000000000000000 16 06
> 06
< 57 05500000 10 0104460329014875676F637A004A6576 72 06
> 06
< 57 05500010 10 69636B6F004875676F4A65760000437A 90 06
> 06
< 57 05500020 10 65636800444D52000000000000000000 98 06
> 06
< 57 05500030 10 00000000000000000000000000000000 95 06
> 06
< 57 05500040 10 00000000000000000000000000000000 A5 06
> 06
< 57 05500050 10 00000000000000000000000000000000 B5 06
> 06
< 57 05500060 10 00000000000000000000000000000000 C5 06
> 06
============================================
< 454E44
> 06
Šipka < označuje přenos dat z počítače do radiostanice. Šipka > označuje přenos dat z radiostanice do počítače. Řádky === rozdělují části zahájení komunikace, přenos dat a ukončení komunikace. Mezery mezi řádky oddělují komunikaci s různými oblastmi paměti. Mezery uvnitř řádku oddělují logické části příkazu tak, jak byly popsány výše. Pro zvídavé můžu už teď prozradit, že tato ukázka představuje zápis jedné věty do digitálního seznamu kontaktů.
Postup popsaný v tomto článku ukazuje pouze předepsaný komunikační protokol. Nic neříká o tom, jak bude radiostanice v případě zápisu na přenesená data reagovat. Jsou adresy, na které je zápis firmwarem radiostanice zakázaný. Jsou adresy, kde před fyzickým zápisem do paměti probíha interní validace dat a teprve její výsledek rozhodne, jestli budou data opravdu zapsaná. Jsou adresy, u kterých kromě platných dat je potřeba poslat ještě další doplňkové informace a teprve podle nich je rozhodnuto, zda jsou data správná a proběhne jejich skutečný zápis. Všechny tyto interní kontroly provádí firmware vysílačky až po ukončení komunikace příkazem "END". Postup konkrétní funkční komunikace s vysílačkou si ukážeme v následujícím článku o digitálním seznamu kontaktů, anglicky Digital Contact List - DCL.