Programování

Java získává sériovou podporu s novým balíkem javax.comm

Rozhraní Java Communications (aka javax.comm) API je navrhované standardní rozšíření, které umožňuje autorům komunikačních aplikací psát software Java, který přistupuje ke komunikačním portům způsobem nezávislým na platformě. Toto API lze použít k zápisu emulačního softwaru terminálu, faxového softwaru, softwaru pro čtečku čipových karet atd.

Vývoj dobrého softwaru obvykle znamená mít některá jasně definovaná rozhraní. Na tomto obrázku je znázorněn diagram na vysoké úrovni vrstev rozhraní API.

V tomto článku vám ukážeme, jak používat javax.comm ke komunikaci se sériovým zařízením založeným na RS-232. Budeme také diskutovat o tom, co poskytuje rozhraní javax.comm API a co neposkytuje. Představíme malý ukázkový program, který vám ukáže, jak komunikovat na sériový port pomocí tohoto API. Na konci článku stručně popíšeme, jak bude toto rozhraní javax.comm API fungovat s jinými ovladači zařízení, a projdeme si požadavky na provedení nativního portu tohoto API pro konkrétní operační systém.

Na rozdíl od klasických ovladačů, které přicházejí s vlastními modely komunikace asynchronních událostí, poskytuje rozhraní javax.comm API rozhraní ve stylu události založené na modelu události Java (balíček java.awt.event). Řekněme, že chceme vědět, jestli na vstupní vyrovnávací paměti jsou nějaká nová data. Můžeme to zjistit dvěma způsoby - tím hlasování nebo Naslouchání. Při dotazování procesor pravidelně kontroluje vyrovnávací paměť, aby zjistil, zda jsou ve vyrovnávací paměti nějaká nová data. Při poslechu procesor čeká, až dojde k události ve formě nových dat ve vstupní vyrovnávací paměti. Jakmile do vyrovnávací paměti dorazí nová data, odešle oznámení nebo událost zpracovateli.

Mezi různými dostupnými sériovými rozhraními jsou dva nejpopulárnější standardy RS-232C a RS-422, které definují úrovně elektrického signálu a význam různých signálních vedení. Nízkorychlostní sériová rozhraní obvykle taktují data jako čtvercovou vlnu, s hodinovou koordinací zajišťovanou start a stop bity.

RS-232 znamená Doporučte standard 232; the C jednoduše odkazuje na nejnovější revizi normy. Sériové porty na většině počítačů používají podmnožinu standardu RS-232C. Plný standard RS-232C specifikuje 25kolíkový "D" konektor, z nichž je použito 22 pinů. Většina z těchto pinů není nutná pro běžnou komunikaci s počítačem a většina nových počítačů je skutečně vybavena konektory typu D mužského pohlaví, které mají pouze 9 pinů. Více informací o RS-232 najdete v části Zdroje.

Poznámka: Chcete-li pochopit, co v minulosti udělali ostatní ovladače, podívejte se na Unix termio manuální stránka nebo OpenBSD Unix, variace zdroje ovladače BSD Unix. To je k dispozici zdarma na internetu. Další informace najdete v části Zdroje.

API javax.comm: Co je poskytováno

Rozhraní javax.comm API poskytuje vývojářům následující funkce:

  • Kompletní specifikace API pro sériové a paralelní komunikační porty. (V tomto článku uvažujeme pouze o sériových portech.) Bez společného API ve vašem vývojovém úsilí se pracovní zátěž zvýší, protože budete muset poskytovat podporu sériovým zařízením.

  • Plná kontrola nad všemi parametry sériového rámování (baud stop bity, parita, bity / rámec), stejně jako manuální nebo automatické ovládání linek řízení toku. Normálně jsou v RS-232 dvě signální linky a zbytek je určen pro kontrolní linky. V závislosti na typu komunikace (synchronní nebo asynchronní) se může počet vybraných řídicích linek lišit. Toto API poskytuje přístup k základním řídicím signálům.

    Krátké odbočení vám pomůže pochopit něco o paritě a bitech start a stop. Parita byla přidána k RS-232, protože komunikační linky mohou být hlučné. Řekněme, že posíláme ASCII 0, což v hexadecimálním formátu odpovídá 0x30 (nebo 00110000 v binárním formátu), ale po cestě někdo projde přidržením magnetu, což způsobí změnu jedné z bitů. Výsledkem je, že místo odeslání 8 bitů, jak bylo zamýšleno, je do prvního řetězce odeslaných bitů přidán další bit, čímž je součet bitů odeslaných sudý nebo lichý. voilà! Máte paritu.

    Do sériového komunikačního protokolu byly přidány startovací a stop bity, které umožnily přijímačům synchronizovat odesílané znaky. Jednobitová parita neumožňuje korekci chyb - pouze detekce. Řešení tohoto problému pocházejí z protokolů, které jsou navrstveny na sériová rozhraní API. Většina sériové komunikace dnes používá blokové protokoly s kontrolními součty (matematická funkce, kterou lze vygenerovat na přijímači a porovnat s přeneseným kontrolním součtem), které umožňují detekovat chyby na větších skupinách bitů. Když komunikujete se svým ISP přes PPP, pakety mohou mít 128 bajtů na paket s kontrolním součtem. Pokud se shodují, máte 99,999% jistotu, že jsou data v pořádku.

    Existují případy, kdy toto schéma nefunguje. Například při odesílání kritických příkazů do zařízení, která jsou ve sluneční soustavě velmi daleko, dopředu opravující protokoly může být použito. Protokoly pro dopřednou korekci jsou nutné, protože na opětovný přenos nemusí být čas a prostor obsahuje hodně elektromagnetického šumu.

    Dobře, zpět na seznam funkcí poskytovaných API javax.comm!

  • Základní I / O prostřednictvím podtřídy streamů Java IO. Pro vstup a výstup používá API javax.comm streamy; koncept streamů by měl být známý všem programátorům Java. Při vytváření nových funkcí je důležité znovu použít koncepty Java, jinak se rozhraní API stanou nepraktickými.

  • Proudy, které lze rozšířit, aby poskytovaly řízení toku klienta a prahové hodnoty. Můžete například chtít upozornění, když ve vyrovnávací paměti zbývá 10 znaků nebo když zbývá pro znaky jen 10 míst. Řízení toku je důležité, když dvě zařízení připojená přes rozhraní nemohou držet krok s ostatními. Bez řízení toku můžete mít překročení nebo podtečení. Ve stavu překročení jste obdrželi data před zpracováním, takže byla ztracena; v podtečení jste byli připraveni na data, ale nebyla k dispozici. Obvykle se tyto podmínky vyskytují na USART (Universal Synchronous Asynchronous Receiver Transmitter), což je hardware, který převádí bajty na formu sériových vln s časováním tak, aby odpovídaly přenosové rychlosti.

    Rozhraní javax.comm API používá model událostí Java k poskytování oznámení o různých změnách signálního vedení a stavu vyrovnávací paměti. Změny stavu se týkají přesně definovaných signálů specifikovaných ve standardu RS-232. Například detekce nosné je použita modemem k signalizaci, že navázal spojení s jiným modemem, nebo detekovala nosný tón. Vytvoření připojení nebo detekce nosného tónu je událost. Detekce událostí a oznámení změn je implementováno v tomto API.

Co není poskytováno

Rozhraní javax.comm API neposkytuje:

  • Zpracování typu liniové disciplíny, správa dialeru nebo správa modemu. Liniová disciplína odkazuje na další zpracování vstupních nebo výstupních znaků. Například jednou běžnou možností následného zpracování je převod CR na CR LF. Tyto termíny mají svůj původ v raných dobách dálnopisů. CR (carriage return) znamená jednoduše vrátit vozík na levý okraj; v arabském světě by to byla správná marže. LF (line feed) posune oblast tisku o jednu nahoru. Když se objevily bitmapové obrazovky a laserové tiskárny, tyto pojmy se staly méně důležitými.

    Správa číselníku a správa modemu jsou další aplikace, které lze zapsat pomocí rozhraní javax.comm API. Správa vytáčení obvykle poskytuje rozhraní s rozhraním AT pro správu modemu. Téměř všechny modemy mají AT příkazové rozhraní. Toto rozhraní je zdokumentováno v příručkách k modemu.

    Snad malý příklad objasní tento koncept. Předpokládejme, že máme modem na COM1 a chceme vytočit telefonní číslo. Aplikace pro správu vytáčení Java se zeptá na telefonní číslo a provede dotaz na modem. Tyto příkazy provádí soubor javax.comm, který neprovádí žádnou interpretaci. Chcete-li například vytočit číslo 918003210288, správa vytáčení pravděpodobně pošle „AT“ a doufá, že získá zpět „OK“, následované ATDT918003210288. Jedním z nejdůležitějších úkolů správy vytáčení a správy modemu je řešení chyb a vypršení časového limitu.

  • GUI pro správu sériového portu. Normálně mají sériové porty dialogové okno, které konfiguruje sériové porty a umožňuje uživatelům nastavit parametry, jako je přenosová rychlost, parita atd. Následující diagram zobrazuje objekty zapojené do čtení a / nebo zápisu dat na sériový port z Javy.

  • Podpora protokolů X, Y a Z modemu. Tyto protokoly poskytují podporu pro detekci a opravu chyb.

Základy programování

Programátoři se příliš často ponoří přímo do projektu a interaktivně kódují pomocí API na obrazovce, aniž by přemýšleli o problému, který se snaží vyřešit. Abyste se vyhnuli nejasnostem a možným problémům, před zahájením projektu shromážděte následující informace. Pamatujte, že programování zařízení obvykle vyžaduje, abyste si přečetli příručku.

  1. Získejte příručku k zařízení a přečtěte si část týkající se rozhraní RS-232 a protokolu RS-232. Většina zařízení má protokol, který je třeba dodržovat. Tento protokol bude přenášen rozhraním javax.comm API a doručen do zařízení. Zařízení bude dekódovat protokol a vy budete muset věnovat zvýšenou pozornost odesílání dat tam a zpět. Pokud nedostanete správné počáteční nastavení, může to znamenat, že se vaše aplikace nespustí, takže si udělejte čas a vyzkoušejte věci pomocí jednoduché aplikace. Jinými slovy vytvořte aplikaci, která může jednoduše zapisovat data na sériový port a poté číst data ze sériového portu pomocí rozhraní API javax.comm.

  2. Zkuste získat vzorky kódu od výrobce. I když jsou v jiném jazyce, mohou být tyto příklady velmi užitečné.

  3. Najděte a zakódujte nejmenší příklad, kterým můžete ověřit, že se zařízením můžete komunikovat. V případě sériových zařízení to může být velmi bolestivé - odesíláte data do zařízení připojeného k sériovému portu a nic se neděje. To je často důsledkem nesprávného kondicionování linky. Pravidlem číslo jedna v programování zařízení (pokud nepíšete ovladač zařízení) je zajistit, abyste mohli se zařízením komunikovat. Udělejte to tak, že najdete nejjednodušší věc, kterou můžete se svým zařízením dělat, a uvedete to do práce.

  4. Pokud je protokol velmi komplikovaný, zvažte získání softwaru pro linkový analyzátor RS-232. Tento software vám umožňuje sledovat data pohybující se mezi dvěma zařízeními na připojení RS-232 bez rušení přenosu.

Úspěšné používání API javax.comm v aplikaci vyžaduje, abyste poskytli nějaký typ rozhraní k protokolu zařízení pomocí sériového API jako transportního mechanismu. Jinými slovy, s výjimkou nejjednodušších zařízení, obvykle existuje další vrstva potřebná k formátování dat pro zařízení. Nejjednodušší protokol je samozřejmě „vanilkový“ - to znamená, že neexistuje žádný protokol. Odesíláte a přijímáte data bez tlumočení.

Přehled navrhovaných kroků pro použití javax.comm

Kromě poskytnutí protokolu zde platí i model vrstvení ISO používaný pro TCP / IP v tom, že máme elektrickou vrstvu, následovanou velmi jednoduchou bajtovou transportní vrstvou. Na začátek této bajtové transportní vrstvy můžete umístit svoji transportní vrstvu. Například váš PPP stack může použít API javax.comm k přenosu bajtů tam a zpět do modemu. Role vrstvy javax.comm je v tomto kontextu poměrně malá:

  1. Dejte některým zařízením kontrolu nad rozhraním javax.comm API. Než zařízení použijete, musí o něm vědět rozhraní API javax.comm.

  2. Otevřete zařízení a upravte linku. Můžete mít zařízení, které vyžaduje přenosovou rychlost 115 kilobitů bez parity.

  3. Napište některá data nebo načtěte data podle protokolu, který zařízení, se kterým komunikujete, vyžaduje. Například pokud se připojíte k tiskárně, možná budete muset odeslat speciální kód pro spuštění tiskárny a / nebo ukončení úlohy. Některé tiskárny PostScript vyžadují, abyste úlohu ukončili odesláním CTRL-D 0x03.

  4. Zavřete port.

Inicializace registru javax.comm API se sériovými porty rozhraní

Rozhraní javax.comm API může spravovat pouze porty, o kterých ví. Nejnovější verze API nevyžaduje inicializaci žádných portů. Při spuštění rozhraní API javax.comm vyhledá porty na konkrétním hostiteli a automaticky je přidá.

Můžete inicializovat sériové porty, které vaše API javax.comm může používat. U zařízení, která nedodržují standardní konvenci pojmenování, je můžete přidat explicitně pomocí níže uvedeného segmentu kódu.

// Zaregistrujte zařízení CommPort ttya = new javax.comm.solaris.SolarisSerial ("ttya", "/ dev / ttya"); CommPortIdentifier.addPort (ttya, CommPortIdentifier.PORT_SERIAL); CommPort ttyb = nový javax.comm.solaris.SolarisSerial ("ttyb", "/ dev / ttyb"); CommPortIdentifier.addPort (ttyb, CommPortIdentifier.PORT_SERIAL); 

Otevírací a klimatizační zařízení

Tato další ukázka kódu ukazuje, jak přidat, podmínit a otevřít zařízení. Podrobnosti o konkrétních voláních metody jsou na stránkách API pro javax.comm. Tento příklad nastaví zařízení s názvem XYZSerialDevice tak, aby bylo přístupné se jménem GenericSerialReader. Zařízení připojené na této lince má přenosovou rychlost 9600, 1 stop bit, znak 8 bitů (ano, mohou být menší) a žádnou paritu. Výsledkem toho všeho je poskytnout dva proudy - jeden pro čtení a druhý pro zápis.

$config[zx-auto] not found$config[zx-overlay] not found