Programování

Otevírání nových portů pro Javu pomocí javax.comm

Balíček tříd javax.comm mi byl představen, když jsem zjistil, že byly použity ve vývojové sadě pro Java Ring. (Podrobnosti o javax.comm najdete v článku Rinalda Di Giorgia Java Developer sloupec v květnovém čísle JavaWorld: „Java získává sériovou podporu s novým balíčkem javax.comm.“) Během mého šíleného spěchu na JavaOne, abych dostal program do mého kruhu, jsem narazil na řadu problémů, v neposlední řadě při komunikaci s prstenem. Stáhl jsem si distribuci z Java Developer Connection a neúspěšně jsem se ji pokusil použít pro komunikaci s Java Ring. Později jsem objevil problém s mým prstenem: neměl jsem správně nainstalovaná starší rozhraní API Dallas Semiconductor. Když prsten fungoval, v podstatě jsem zapomněl na komunikační balíček. Tedy až do jednoho víkendu asi před měsícem, což je výchozí bod pro tento příběh.

Z mnoha různých důvodů (většinou jde o vysoce interaktivní simulovaná prostředí - například hry) je na primárním počítači v mé „laboratoři“ spuštěn Windows 95. Avšak o tomto konkrétním víkendu jsem se více zajímal o jiný počítač, který v mnoha způsoby, byl stejně silný jako Java Ring: Digital Equipment Corporation PDP-8 / e.

PDP-8 byl pravděpodobně první skutečný osobní počítač. Model PDP-8, který byl navržen koncem šedesátých let a vyráběn v relativně vysokých množstvích v 70. letech, mohl zvednout jediný jednotlivec, byl napájen proudem 120 voltů a stál méně než 0,000. Většina z těchto počítačů byla dodávána s jediným periferním zařízením: terminál Teletype Model ASR-33 - původní „TTY“ v počítačovém žargonu.

Teletyp ASR-33 byl tiskový terminál, který byl dodán se čtečkou papírové pásky a razníkem. Ano, byla to papírová páska, 1 "široký papír s vyraženými otvory, což bylo primární paměťové médium pro programy na PDP-8.

PDP-8 byl první počítač, který jsem kdy naprogramoval, a proto má v mém srdci zvláštní místo. Dále jsem kvůli náhodným okolnostem byl ve správný čas na správném místě a podařilo se mi zachránit PDP-8, který měl být vyřazen jako haraburdí. Níže je uvedena fotografie mé ceny.

O tomto zvláštním víkendu, který nebyl nedávno, jsem se rozhodl přivést PDP-8 zpět k životu, jen abych znovu prožil ty vzácné časné vzpomínky a ukázal své dceři, jak dobře to má se svým „starým Pentium o frekvenci 133 MHz. "

Oživení jedné klasiky simulováním druhé

Abych zahájil své úsilí o oživení, musel jsem dostat program do PDP-8. Na PDP-8 je toho dosaženo sledováním tříkrokového procesu:

  1. Pomocí přepínačů na předním panelu uživatel „klíčuje“ krátký program do paměti magnetického jádra. Tento program se nazývá RIM Loader a jeho účelem je načíst jiný program z papírové pásky, která je ve formátu Read-in-Mode nebo RIM.

  2. RIM Loader načte papírovou pásku ve formátu RIM. Tato páska obsahuje program s názvem BIN Loader, který dokáže načíst programy z papírové pásky v binárním (BIN) formátu.

  3. Nakonec spustíte zavaděč BIN a načtete program, který opravdu chcete, který je na papírové pásky ve formátu BIN. Fíha!

Po provedení těchto tří kroků se program, který chcete spustit, uloží do základní paměti. Uživatel pak musí pouze nastavit počáteční adresu a říct stroji, aby „šel“.

Ve své snaze oživit stroj nebyl krok 1 problém, ale krok 2 zahrnoval použití čtečky papírových pásek v Teletype - a já jsem Teletype neměl. Samozřejmě, že jsem dělal mít svůj stolní počítač, takže logickým krokem bylo simulovat čtečku papírových pásek na mém stolním počítači.

Z logického a programového hlediska je simulace čtečky papírové pásky triviální. Jednoduše načtete soubor, který obsahuje data z „pásky“, odešlete jej na sériový port rychlostí 110 baudů (ano, pouze 10 znaků za sekundu), dokud soubor nevyčerpáte. Dokázal jsem napsat program v jazyce C na mém systému Solaris nebo na mém systému FreeBSD asi za 10 minut, což by to dokázalo - ale pamatujte, že jsem byl v systému Windows 95, ne v systému Unix.

Od špatných po ošklivé a zase zpátky

Věděl jsem, že mohu snadno napsat tento program v jazyce C, takže to byl můj jazyk volby. Špatná volba. Přivedl jsem svou kopii Visual C ++ 5.0 a vybičoval jednoduchý program s názvem sendtape.c, který volal otevřeno() na komunikačním portu. Snažil jsem se to nastavit DRSNÝ režim (režim v Unixu, kde se operační systém nepokouší interpretovat cokoli na sériovém portu jako vstup uživatele) a poté se to pokusil zkompilovat. Jejda, ne ioctl () funkce nebo tty funkce - nada, zip, zilch!

Žádný problém, pomyslel jsem si: „Mám celou kompilaci Microsoft Software Developer's Network na CD s mým kompilátorem C; rychle vyhledám klíčová slova„ port COM “.“

Hledání ukázalo mnoho odkazů na model Microsoft Component Object Model (také nazývaný COM) a také odkazy na MSComm. MSComm je třída C ++, kterou společnost Microsoft dodává pro komunikaci se sériovými porty. Podíval jsem se na příklady a byl jsem zděšen, kolik kódu by bylo potřeba k provedení takové jednoduché věci, jako je zápis bajtů na sériový port při rychlosti 110 baudů. Jediné, co jsem chtěl udělat, bylo otevřít zatracený sériový port, nastavit jeho přenosovou rychlost a zaplnit několik bajtů - nevytvářet novou třídu aplikací rozšířených o sériovou komunikaci!

Před mým monitorem seděl receptor Blue Dot pro můj Java Ring a pomyslel jsem si: „Aha! Lidé v Dallas Semiconductor přišli na to, jak mluvit se sériovým portem na PC. Podívejme se, co dělají. " Po prohlédnutí zdrojového kódu společnosti pro Win32 bylo jasné, že mluvit se sériovými porty nebude jednoduchý úkol.

Java na záchranu

V tomto okamžiku mého víkendu jsem přemýšlel, že bych možná přetáhl jeden ze svých unixových strojů do laboratoře, abych mohl program kódovat na to místo toho, abych použil to, co jsem už měl. Pak jsem si vzpomněl na své zkušenosti s Java Ringem a balíčkem java.comm od Sunu. Místo toho jsem se rozhodl pokračovat touto cestou.

Co poskytuje java.comm?

Rozhraní Java Communications API - nebo java.comm - poskytuje metodu nezávislou na platformě pro přístup k sériovým a paralelním portům z Javy. Stejně jako u jiných rozhraní Java API, jako jsou JFC, JDBC a Java 3D, je programátor nucen k určité úrovni nepřátelství izolovat od programovacího modelu myšlenku platformy „co je to sériový port“. V případě designu javax.comm se položky jako názvy zařízení, které se liší od platformy k platformě, nikdy nepoužívají přímo. Tři rozhraní API poskytují na platformě nezávislý přístup k sériovým a paralelním portům. Tato rozhraní poskytují volání metod k vypsání dostupných komunikačních portů, ovládání sdíleného a výhradního přístupu k portům a ovládání specifických funkcí portů, jako je přenosová rychlost, generování parity a řízení toku.

Když jsem v dokumentaci viděl příklad SimpleWrite.java a porovnal jeho 40 řádků kódu se 150 až 200 řádky kódu, na který jsem se díval při psaní v C, věděl jsem, že řešení je po ruce.

Abstrakce na vysoké úrovni pro tento balíček je třída javax.comm.CommPort. The CommPort třída definuje druhy věcí, které byste obvykle dělali s portem, což zahrnuje získávání InputStream a Výstupní proud objekty, které jsou I / O kanály pro port. The CommPort třída také zahrnuje metody pro řízení velikostí vyrovnávací paměti a úpravu způsobu zpracování vstupu. Protože jsem věděl, že tyto třídy podporují One-Wire protokol Dallas Semiconductor (protokol, který zahrnoval dynamické změny přenosové rychlosti a úplnou transparentnost přenášených bajtů), věděl jsem, že API javax.comm musí být flexibilní. Příjemným překvapením bylo, jak těsné byly třídy: Měli dostatek flexibility, aby práci zvládli, a už ne. Nebyl žádný nebo žádný zbytečný bloatware v podobě „pohodlných metod“ nebo podpory modemových protokolů jako Kermit nebo xmodem.

Doprovodná třída CommPort je javax.comm.CommPortIdentifier třída. Tato třída abstrahuje vztah mezi tím, jak je port pojmenován v konkrétním systému (tj. „/ Dev / ttya“ v systémech Unix a „COM1“ v systémech Windows), a tím, jak jsou porty objevovány. Statická metoda getCommPortIdentifikátory vypíše všechny známé komunikační porty v systému; dále můžete přidat své vlastní názvy portů pro porty pseudo komunikace pomocí addPortName metoda.

The CommPort třída je ve skutečnosti abstraktní a to, co dostanete zpět z vyvolání openPort v CommPortIdentifier je podtřída CommPort to je buď Paralelní port nebo Sériový port. Každá z těchto dvou podtříd má další metody, které vám umožňují ovládat samotný port.

Síla Javy

Můžete argumentovat o realitě „psát jednou, běžet kdekoli“, vše, co chcete, ale ze zkušenosti vám řeknu, že pro aplikace s jedním nebo dokonce více vlákny bez GUI je Java tam. Konkrétně, pokud chcete napsat program, který běží na systémech Unix, Win32 a Mac a má přístup k sériovému portu, pak Java je pouze řešení dnes.

Výhodou je, že k údržbě kódu, který běží na velkém počtu platforem, je zapotřebí méně prostředků - a to snižuje náklady.

Řada aplikací sdílí požadavek mít docela nízkoúrovňový přístup k sériovému portu. Termín nízká úroveň v této souvislosti znamená, že program má přístup k rozhraním, která mu umožňují měnit režimy za běhu a přímo vzorkovat a měnit stavy hardwarových kolíků řízení toku. Kromě mého projektu PDP-8 potřeboval Dallas Semiconductor používat rozhraní Blue Dot na sériových portech, aby mohl mluvit s iButton s Javou. Tvůrci mikroprocesorů mají navíc vyhodnocovací desky, které pro komunikaci a načítání programů používají sériový port. Všechny tyto aplikace lze nyní kompletně a přenositelně psát v jazyce Java - což je docela silné prohlášení.

Veškerá tato síla pro ovládání paralelních a sériových portů hostitelského počítače pochází z knihovny javax.comm. Poskytnutí přístupu programátorům Java k portům otevírá zcela novou sadu aplikací, které cílí na vestavěné systémy. V mém případě mi to dalo možnost napsat svůj emulátor čtečky papírové pásky TTY úplně v Javě.

Jak si můžeš hrát s těmito věcmi?

Chcete-li získat kopii nejnovější distribuce javax.comm, musíte se nejprve zaregistrovat jako vývojář v Java Developer Connection (JDC), pokud jste tak ještě neučinili. (Viz Zdroje.) JDC je zdarma a jako člen získáte včasný přístup k třídám Java, které budou nakonec součástí konečného produktu.

Přejděte do sekce Java Communications API a stáhněte si nejnovější archivační soubor javax.comm. Rozbalte soubor a nainstalujte sdílené knihovny (ano, virtuální stroj Java potřebuje nativní kód, aby mohl mluvit s porty - naštěstí to nemusíte psát) a nainstalujte soubor comm.jar. Nakonec přidejte soubor comm.jar do svého CLASSPATH proměnná.

Jakmile je soubor comm.jar uložen v adresáři lib vaší instalace Java a soubor win32comm.dll je uložen v adresáři bin vaší instalace Java, můžete zkompilovat a spustit všechny příklady dodávané se stažením. Doporučuji vám je prohlédnout, protože ve zdrojovém kódu je spousta dobrých informací.

Kde to zanechá PDP-8?

Co se tedy stalo s PDP-8? Myslel jsem, že se nikdy nezeptáš! Po přečtení dokumentu README, který byl dodán s distribucí javax.comm, a poté skenování JavaDocs balíčku javax.comm, jsem sestavil třídu aplikace s názvem Odeslat pásku. Tato třída simuluje čtečku papírových pásek otevřením sériového portu a zaplněním bajtů nad ním při rychlosti 110 baudů. Kód této třídy je zobrazen zde:

importovat javax.comm. *; importovat java.io. *; veřejná třída SendTape {static final int LEADER = 0; statický konečný int COLLECT_ADDR = 1; statický konečný int COLLECT_DATA = 2; statický konečný int COLLECT_DATA2 = 3; / * Toto pole obsahuje kopii zavaděče formátu BIN * / static byte binloader [] = {(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, ... (byte) 0x80, ( byte) 0x80,}; 

Fragment kódu výše je první částí souboru Odeslat pásku třída. Tato třída začíná implicitním importováním všech tříd v balíčku javax.comm a balíčcích java.io. The Odeslat pásku class potom definuje některé konstanty a preinicializuje bajtové pole tak, aby obsahovalo program BIN Loader, který jsem zmínil dříve. Zahrnul jsem zavaděč BIN, protože je vždy potřebný při inicializaci paměti PDP-8 a stále jsem ztrácel přehled o tom, kde jsem naposledy uložil soubor obsahující jeho obraz ve formátu RIM. S tímto zásadním obrázkem papírové pásky vloženým do třídy tímto způsobem mám vždy možnost ji do této třídy načíst.

 / ** * Tato metoda spouští mini-stavový stroj, který poskytuje * užitečný lidsky čitelný výstup toho, co se děje * při stahování. * / static int newState (int oldState, byte b) {...} 

Po inicializaci máte kód metody nový stát, zobrazené výše, které sleduje obsah papírové pásky (ať už jde o informace o adrese nebo informace o programování). Výše uvedená metoda také vytiskne zprávu pro každé umístění paměti na PDP-8, které je inicializováno.

Dále máte hlavní metoda, která je uvedena níže; otevře soubor a načte jej dovnitř. Poté kód otevře sériový port a nastaví jeho komunikační parametry.