Programovanie

Otváranie nových portov pre Javu pomocou javax.comm

Balík tried javax.comm mi bol predstavený, keď som zistil, že sa používajú vo vývojovej súprave pre Java Ring. (Podrobnosti na javax.comm nájdete v dokumente Rinalda Di Giorgia Vývojár Java stĺpec v májovom vydaní JavaWorld: „Java získava sériovú podporu s novým balíkom javax.comm.“) Počas môjho šialeného zhonu, keď som dostal JavaOne, aby som dostal program do môjho ringu, narazil som na rôzne problémy, z ktorých posledná bola komunikácia s ringu. Stiahol som si distribúciu z Java Developer Connection a neúspešne som sa ju snažil použiť na komunikáciu s Java Ringom. Neskôr som objavil problém s mojím prsteňom: nemal som správne nainštalované staršie API Dallas Semiconductor. Keď krúžok fungoval, v podstate som zabudol na komunikačný balík. Teda až do jedného víkendu asi pred mesiacom, ktorý je východiskom pre tento príbeh.

Z mnohých rôznych dôvodov (väčšinou to súvisí s vysoko interaktívnym simulovaným prostredím - napríklad s hrami) je na primárnom počítači v mojom „laboratóriu“ spustený Windows 95. Avšak tento konkrétny víkend som sa viac zaoberal iným počítačom, ktorý v mnohými spôsobmi, bol asi taký silný ako Java Ring: Digital Equipment Corporation PDP-8 / e.

PDP-8 bol pravdepodobne prvý skutočný osobný počítač. PDP-8, ktorý bol navrhnutý na konci 60. rokov a vyrábal sa v relatívne vysokých množstvách v 70. rokoch, mohol zdvihnúť jeden jednotlivec, bol napájaný sieťovým prúdom 120 voltov a stál menej ako 0,000. Väčšina z týchto počítačov sa dodáva s jediným periférnym zariadením: terminál Teletype Model ASR-33 - pôvodný počítač „TTY“ v počítačovom jazyku.

Teletyp ASR-33 bol tlačiarenský terminál, ktorý bol dodávaný s čítačkou papierových pások a razníkom. Áno, to bola papierová páska, 1 "široký papier s dierkami v ňom, ktorý bol primárnym úložným médiom pre programy na PDP-8.

PDP-8 bol prvý počítač, ktorý som kedy programoval, a preto má v mojom srdci špeciálne miesto. Ďalej som kvôli náhodným okolnostiam bol v správnom čase na správnom mieste a podarilo sa mi uložiť PDP-8, ktorý bude zošrotovaný ako haraburdu. Fotografia mojej ceny je uvedená nižšie.

Počas tohto špeciálneho víkendu, nie je to tak dávno, čo som sa rozhodol vrátiť PDP-8 späť do života, len aby som znovu prežil tie vzácne ranné spomienky a ukázal svojej dcére, aké dobré to má so svojím „staromódnym Pentiom s frekvenciou 133 MHz“. „

Oživenie jednej klasiky simulovaním druhej

Aby som mohol začať svoje oživovacie úsilie, musel som dostať program do PDP-8. Na PDP-8 sa to dá dosiahnuť trojstupňovým procesom:

  1. Pomocou prepínačov na prednom paneli používateľ „zašifruje“ krátky program do pamäte magnetického jadra. Tento program sa nazýva RIM Loader a jeho účelom je načítať ďalší program z papierovej pásky, ktorá je vo formáte Read-in-Mode alebo RIM.

  2. RIM Loader zavedie papierovú pásku vo formáte RIM. Táto páska obsahuje program s názvom BIN Loader, ktorý dokáže načítať programy z papierovej pásky v binárnom (BIN) formáte.

  3. Nakoniec spustíte program BIN Loader, aby ste načítali program, ktorý skutočne chcete, a ktorý je na papierovej páske vo formáte BIN. Fíha!

Po vykonaní týchto troch krokov sa program, ktorý chcete spustiť, uloží do základnej pamäte. Používateľ potom musí iba nastaviť počiatočnú adresu a povedať zariadeniu, aby „išlo“.

V mojej snahe oživiť stroj nebol krok 1 žiadny problém, ale krok 2 zahŕňal použitie čítačky papierových pások v teletype - a ja som teletype nemal. Samozrejme, že ja urobil mať môj stolný počítač, takže logickým krokom bolo simulovať čítačku papierových pások na mojom počítači.

Z logického a programového hľadiska je simulácia čítačky papierových pások triviálna. Jednoducho prečítate súbor, ktorý obsahuje údaje z „pásky“, a pošlete ho na sériový port rýchlosťou 110 baudov (áno, iba 10 znakov za sekundu), kým súbor nevyčerpáte. Dokázal som napísať program v jazyku C na mojom systéme Solaris alebo FreeBSD asi za 10 minút, ktorý by to dokázal - ale nezabudnite, že som bol na systéme Windows 95, nie na systéme Unix.

Od zlého k škaredému a zase späť

Vedel som, že môžem ľahko napísať tento program v jazyku C, takže to bol môj jazyk, ktorý som si vybral. Zlá voľba. Vyvolal som svoju kópiu Visual C ++ 5.0 a vytasil z nej jednoduchý program s názvom sendtape.c, ktorý volal otvorené() na komunikačnom porte. Skúšal som to dať do RAW režim (režim v Unixe, kde sa operačný systém nepokúša interpretovať nič na sériovom porte ako vstup používateľa) a potom sa to pokúsil skompilovať. Ojoj, nie ioctl () funkcia resp tty funkcie - nada, zip, zilch!

Žiaden problém, pomyslel som si: „Mám celú kompiláciu Microsoft Software Developer's Network na CD so svojím kompilátorom C; rýchlo vyhľadám kľúčové slová„ port COM “.“

Pri vyhľadávaní sa objavilo veľa odkazov na model Microsoft Component Object Model (tiež nazývaný COM) a tiež odkazy na MSComm. MSComm je trieda C ++, ktorú spoločnosť Microsoft dodáva na komunikáciu so sériovými portami. Pozrel som sa na príklady a bol som zhrozený, koľko kódu by bolo treba na vykonanie takej jednoduchej veci, ako je zápis bajtov na sériový port pri rýchlosti 110 baudov. Všetko, čo som chcel urobiť, bolo otvoriť zatracovaný sériový port, nastaviť jeho prenosovú rýchlosť a nabiť ho o niekoľko bajtov - nevytvárať novú triedu aplikácií vylepšených sériovou komunikáciou!

Pred mojím monitorom sedel receptor Blue Dot pre môj Java Ring a pomyslel som si: „Aha! Ľudia v Dallas Semiconductor prišli na to, ako hovoriť so sériovým portom na počítači. Pozrime sa, čo robia. „ Po prezretí zdrojového kódu spoločnosti pre Win32 bolo jasné, že rozhovor so sériovými portami nebude jednoduchá záležitosť.

Java na záchranu

V tento okamih môjho víkendu som premýšľal, či by som jeden z mojich unixových strojov nepretiahol do laboratória, aby som program mohol kódovať na to namiesto toho, aby som použil to, čo som už mal. Potom som si spomenul na svoje skúsenosti s Java Ringom a balíkom java.comm od spoločnosti Sun. Namiesto toho som sa rozhodol ísť touto cestou.

Čo poskytuje java.comm?

Rozhranie Java Communications API - alebo java.comm - poskytuje metódu nezávislú od platformy pre prístup k sériovým a paralelným portom z Javy. Rovnako ako v prípade iných rozhraní API Java, ako sú JFC, JDBC a Java 3D, je programátor nútený k určitej úrovni nepriamosti, aby od programovacieho modelu izoloval predstavu platformy „čo je to sériový port“. V prípade dizajnu javax.comm sa položky, ako sú názvy zariadení, ktoré sa líšia medzi platformami, nikdy nepoužívajú priamo. Tri rozhrania API poskytujú nezávislý na platforme prístup k sériovým a paralelným portom. Tieto rozhrania poskytujú volania metód na zoznam dostupných komunikačných portov, na riadenie zdieľaného a výlučného prístupu k portom a na riadenie špecifických funkcií portov, ako je prenosová rýchlosť, generovanie parity a riadenie toku.

Keď som v dokumentácii uvidel príklad SimpleWrite.java a porovnal som jeho 40 riadkov kódu so 150 až 200 riadkami kódu, na ktorý som sa díval pri písaní v jazyku C, vedel som, že riešenie je po ruke.

Abstrakciou na vysokej úrovni pre tento balík je trieda javax.comm.CommPort. The CommPort trieda definuje druhy vecí, ktoré by ste zvyčajne robili s portom, medzi ktoré patrí získanie InputStream a OutputStream objekty, ktoré sú I / O kanálmi pre port. The CommPort trieda obsahuje aj metódy na kontrolu veľkostí vyrovnávacej pamäte a úpravu spôsobu spracovania vstupu. Pretože som vedel, že tieto triedy podporujú protokol Dallas Semiconductor One-Wire (protokol, ktorý zahŕňal dynamické zmeny prenosovej rýchlosti a úplnú transparentnosť prenášaných bajtov), ​​vedel som, že API javax.comm musí byť flexibilné. Príjemným prekvapením bolo, aké tesné boli triedy: Mali dosť flexibility na vykonanie práce a už vôbec nie. Nebol takmer žiadny zbytočný bloatware vo forme „pohodlných metód“ alebo podpory modemových protokolov ako Kermit alebo xmodem.

Sprievodná trieda pre CommPort je javax.comm.CommPortIdentifier trieda. Táto trieda abstrahuje vzťah medzi tým, ako je pomenovaný port v konkrétnom systéme (to je „/ dev / ttya“ v systémoch Unix a „COM1“ v systémoch Windows), a tým, ako sú porty objavené. Statická metóda getCommPortIdentifikátory vypíše všetky známe komunikačné porty v systéme; ďalej môžete pridať svoje vlastné názvy portov pre pseudo komunikačné porty pomocou addPortName metóda.

The CommPort trieda je vlastne abstraktná a to, čo dostanete späť po vyvolaní openPort v CommPortIdentifier je podtrieda CommPort to je buď ParallelPort alebo Sériový port. Každá z týchto dvoch podtried má ďalšie metódy, ktoré vám umožňujú ovládať samotný port.

Sila Javy

Môžete polemizovať o realite „napísať raz, bežať kdekoľvek“, kamkoľvek chcete, ale zo skúsenosti vám poviem, že pre aplikácie s jedným alebo dokonca jednoduchými vláknami bez GUI je Java tam. Konkrétne, ak chcete napísať program, ktorý beží na systémoch Unix, Win32 a Mac a má prístup k sériovému portu, potom Java je iba riešenie dnes.

Výhodou je, že na údržbu kódu, ktorý beží na veľkom počte platforiem, je potrebných menej zdrojov - a to znižuje náklady.

Mnoho aplikácií zdieľa požiadavku nízkej úrovne prístupu k sériovému portu. Termín nízky level v tejto súvislosti znamená, že program má prístup k rozhraniam, ktoré mu umožňujú meniť režimy za chodu a priamo vzorkovať a meniť stavy hardwarových kolíkov riadenia toku. Okrem môjho projektu PDP-8 potreboval Dallas Semiconductor na komunikáciu s iButton s Javou používať svoje rozhrania Blue Dot na sériových portoch. Výrobcovia mikroprocesorov majú navyše vyhodnocovacie dosky, ktoré na komunikáciu a načítanie programov používajú sériový port. Všetky tieto aplikácie môžu byť teraz úplne a prenosne napísané v jazyku Java - čo je veľmi silné vyhlásenie.

Celá táto moc na kontrolu paralelných a sériových portov hostiteľského počítača pochádza z knižnice javax.comm. Poskytnutím prístupu programátorom Java k portom sa otvára úplne nová sada aplikácií zameraných na zabudované systémy. V mojom prípade mi to dalo možnosť napísať môj emulátor čítačky papierových pások TTY úplne v Jave.

Ako si môžete zahrať s týmito vecami?

Ak chcete získať kópiu najnovšej distribúcie javax.comm, musíte sa najskôr zaregistrovať ako vývojár v Java Developer Connection (JDC), ak ste tak ešte neurobili. (Pozri Zdroje.) JDC je zadarmo a ako člen získate skorý prístup k triedam Java, ktoré budú nakoniec súčasťou konečného produktu.

Prejdite do sekcie Java Communications API a stiahnite si najnovší archívny súbor javax.comm. Rozbaľte súbor a nainštalujte zdieľané knižnice (áno, virtuálny stroj Java potrebuje natívny kód, aby mohol hovoriť s portami - našťastie ho nemusíte písať) a nainštalujte súbor comm.jar. Nakoniec pridajte súbor comm.jar do svojho súboru CLASSPATH premenná.

Keď je súbor comm.jar uložený v adresári lib vašej inštalácie Java a súbor win32comm.dll je uložený v priečinku bin vašej inštalácie Java, môžete skompilovať a spustiť všetky príklady, ktoré sú súčasťou sťahovania. Odporúčam vám pozrieť sa na ne, pretože v zdrojovom kóde je veľa dobrých informácií.

Kde to zanechá PDP-8?

Čo sa teda stalo s PDP-8? Myslel som si, že sa nikdy nepýtaš! Po prečítaní dokumentu README, ktorý bol dodaný s distribúciou javax.comm, a po skenovaní balíka javax.comm v JavaDocs som zostavil triedu aplikácií s názvom SendTape. Táto trieda simuluje čítačku papierových pások otvorením sériového portu a vyprázdnením bajtov pri rýchlosti 110 baudov. Kód tejto triedy je uvedený tu:

import javax.comm. *; import java.io. *; verejná trieda 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 kópiu načítača formátu BIN * / static byte binloader [] = {(byte) 0x80, (byte) 0x80, (byte) 0x80, (byte) 0x80, ... (byte) 0x80, ( bajt) 0x80,}; 

Fragment kódu uvedený vyššie je prvou časťou súboru SendTape trieda. Táto trieda začína implicitným importom všetkých tried v balíku javax.comm a balíkoch java.io. The SendTape trieda potom definuje niektoré konštanty a predbežne inicializuje bajtové pole tak, aby obsahovalo program BIN Loader, ktorý som spomínal už skôr. Zahrnul som BIN Loader, pretože je vždy potrebný pri inicializácii pamäte PDP-8 a stále strácal prehľad o tom, kam som naposledy uložil súbor obsahujúci jeho obrázok vo formáte RIM. S týmto zásadným obrázkom papierovej pásky vloženým do triedy týmto spôsobom mám vždy možnosť načítať ho do tejto triedy.

 / ** * Táto metóda prevádzkuje mini-stavový stroj, ktorý poskytuje * užitočný ľudsky čitateľný výstup toho, čo sa deje * pri sťahovaní. * / static int newState (int oldState, byte b) {...} 

Po inicializácii máte kód metódy nový štát, zobrazené vyššie, ktoré sleduje obsah papierovej pásky (či už sú to informácie o adrese alebo informácie o programovaní). Vyššie uvedená metóda tiež vytlačí správu pre každé umiestnenie pamäte na PDP-8, ktoré je inicializované.

Ďalej máte hlavný metóda, ktorá je uvedená nižšie; otvorí súbor a načíta ho. Potom kód otvorí sériový port a nastaví jeho komunikačné parametre.

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