Programiranje

Odpiranje novih vrat na Javi z javax.comm

S paketom predavanj javax.comm sem se seznanil, ko sem odkril, da so bili uporabljeni v razvojnem kompletu za Java Ring. (Za podrobnosti o javax.comm glejte Rinaldo Di Giorgio's Razvijalec Java stolpec v majski številki JavaWorld: "Java dobi serijsko podporo z novim paketom javax.comm.") Med mojim blaznim hitenjem JavaOneja, da bi prinesel program v svoj obroč, sem naletel na različne težave, nenazadnje pri komunikaciji z obročem. Distribucijo sem prenesel s povezave Java Developer Connection in jo neuspešno poskušal uporabiti za pogovor z Java Ring. Kasneje sem odkril težavo z mojim obročem: nisem imel pravilno nameščenih starih API-jev Dallas Semiconductor. Ko je obroč deloval, sem v bistvu pozabil na komunikacijski paket. Se pravi do nekega vikenda pred približno mesecem dni, kar je izhodišče za to zgodbo.

Iz številnih različnih razlogov (predvsem zaradi zelo interaktivnih simuliranih okolij - na primer iger) ima primarni računalnik v mojem "laboratoriju" operacijski sistem Windows 95. Vendar me je ta konec tedna bolj skrbel drug računalnik, ki je bil v v mnogih pogledih je bil približno tako močan kot Java Ring: Digital Equipment Corporation PDP-8 / e.

PDP-8 je bil verjetno prvi pravi osebni računalnik. PDP-8, zasnovan konec šestdesetih let prejšnjega stoletja in izdelan v sorazmerno visokih količinah, ga je lahko dvignil en posameznik, napajal ga je 120-voltni linijski tok in je stal manj kot 0 000. Večina teh računalnikov je bila dobavljena z eno zunanjo napravo: s terminalom Teletype Model ASR-33 - original "TTY" v računalniškem jeziku.

Teletype ASR-33 je bil tiskalniški terminal, ki je bil priložen čitalniku papirja in traku. Ja, prav papirni trak, 1-palčni papir z luknjami v njem je bil glavni medij za shranjevanje programov na PDP-8.

PDP-8 je bil prvi računalnik, ki sem ga kdajkoli programiral, zato ima v mojem srcu posebno mesto. Poleg tega sem bil zaradi nekaterih naključnih okoliščin ob pravem času na pravem mestu in mi je uspelo rešiti PDP-8, ki ga bodo odstranili kot smeti. Fotografija moje nagrade je prikazana spodaj.

Na ta poseben konec tedna, ki se je zgodil pred kratkim, sem se odločil, da bom PDP-8 spet zaživel, da bi le obudil tiste dragocene zgodnje spomine in hčerki pokazal, kako dobro jo ima s svojim "ošpicom starim 133-MHz Pentiumom. "

Oživitev ene klasike s simulacijo druge

Za začetek prizadevanj za preporod sem moral dobiti program v PDP-8. Pri PDP-8 se to doseže s postopkom v treh korakih:

  1. S pomočjo stikal na sprednji plošči uporabnik "vtipka" kratek program v pomnilnik magnetnega jedra. Ta program se imenuje RIM Loader, njegov namen pa je naložiti drug program s papirnatega traku, ki je v formatu Read-in-Mode ali RIM.

  2. RIM Loader naloži papirni trak v formatu RIM. Ta trak vsebuje program, imenovan BIN Loader, ki lahko naloži programe s papirnatega traku v binarni (BIN) obliki.

  3. Na koncu zaženete BIN Loader, da naložite želeni program, ki je na papirnatem traku v obliki BIN. Joj!

Po teh treh korakih se program, ki ga želite zagnati, shrani v osnovni pomnilnik. Vse kar mora uporabnik nato nastaviti, je nastaviti začetni naslov in ukazati napravi, da gre.

Pri mojih prizadevanjih za oživitev stroja 1. korak ni predstavljal težav, toda 2. korak je vključeval uporabo čitalnika papirnatega traku v teletipu - in teletajpa nisem imel. Seveda, jaz naredil imam namizni računalnik, zato je bil logičen korak simulacija bralnika papirnatega traku na namizju.

Z logičnega in programskega stališča je simulacija bralnika papirnatih trakov nepomembna. Preprosto preberete datoteko, ki vsebuje podatke s "traku", in jo pošljete v serijska vrata s hitrostjo 110 baudov (da, samo 10 znakov na sekundo), dokler datoteke ne izčrpate. V približno 10 minutah bi lahko napisal program v jeziku C na sistemu Solaris ali sistemu FreeBSD, ki bi to lahko storil - toda ne pozabite, da sem bil v sistemu Windows 95 in ne v sistemu Unix.

Od slabega do grdega in spet nazaj

Vedela sem, da lahko ta program zlahka napišem v jeziku C, zato je bil to moj jezik. Slaba izbira. Pripeljal sem svojo kopijo Visual C ++ 5.0 in ustvaril preprost program, imenovan sendtape.c, ki je klical odprto() na komunikacijskih vratih. Poskušal sem ga nastaviti SUROV mode (način v Unixu, kjer operacijski sistem na posamičnih vratih ne poskuša razlagati ničesar kot uporabniški vnos) in ga nato poskušal sestaviti. Ups, ne ioctl () funkcijo oz tty funkcije - nada, zip, zilch!

Brez problema, sem si mislil: "Z CD-jevim prevajalnikom imam na CD-ju celotno omrežno knjižnico Microsoftovega razvijalca programske opreme; na hitro bom iskal ključne besede" COM port "."

Iskanje je odkrilo veliko sklicev na Microsoftov komponentni objektni model (imenovan tudi COM) in tudi sklicevanje na MSComm. MSComm je razred C ++, ki ga Microsoft dobavi za pogovor s serijskimi vrati. Ogledal sem si primere in se zgrozil, koliko kode bi bilo treba narediti tako preprosto stvar, kot je zapisovanje bajtov v serijska vrata na 110 baud. Vse, kar sem hotel storiti, je bilo odpreti pomračena serijska vrata, nastaviti hitrost prenosa in vstaviti nekaj bajtov navzdol - ne pa ustvariti novega razreda aplikacij, izboljšanih s serijsko komunikacijo!

Pred mojim monitorjem je bil sprejemnik modre pike za moj Java Ring in pomislil sem si: "Aha! Ljudje iz Dallas Semiconductorja so ugotovili, kako naj govorijo s serijskimi vrati na računalniku. Poglejmo, kaj delajo. " Po pregledu izvorne kode podjetja za Win32 je bilo jasno, da pogovor s serijskimi vrati ne bo preprosta naloga.

Java na pomoč

V tem trenutku konec tedna sem razmišljal, da bi morda enega od svojih Unixovih strojev povlekel v laboratorij, da bi program kodiral to namesto da bi uporabil tisto, kar sem že imel. Nato sem se spomnil svoje izkušnje z Java Ringom in paketom java.comm podjetja Sun. Namesto tega sem se odločil za to pot.

Kaj ponuja java.comm?

API za komunikacijo Java - ali java.comm - ponuja od platforme neodvisno metodo za dostop do serijskih in vzporednih vrat iz Jave. Tako kot pri drugih Java API-jih, kot so JFC, JDBC in Java 3D, je tudi programer prisiljen, da določena stopnja posrednosti izloči idejo platforme o tem, "kaj so serijska vrata", od programskega modela. V primeru zasnove javax.comm se elementi, kot so imena naprav, ki se razlikujejo od platforme do platforme, nikoli ne uporabljajo neposredno. Trije vmesniki API-ja omogočajo neodvisen dostop do serijskih in vzporednih vrat. Ti vmesniki omogočajo klice metod za seznam razpoložljivih komunikacijskih vrat, nadzor skupnega in ekskluzivnega dostopa do vrat ter nadzor posebnih funkcij vrat, kot so hitrost prenosa podatkov, generiranje parnosti in nadzor pretoka.

Ko sem v dokumentaciji videl primer SimpleWrite.java in primerjal njegovih 40 vrstic kode s 150 do 200 vrsticami kode, ki sem jo iskal v C, sem vedel, da je rešitev na voljo.

Vrhunska abstrakcija za ta paket je razred javax.comm.CommPort. The CommPort class definira vrste stvari, ki bi jih običajno počeli z vrati, kar vključuje pridobivanje InputStream in Izhodni tok predmeti, ki so V / I kanali za vrata. The CommPort razred vključuje tudi metode za nadzor velikosti medpomnilnika in prilagajanje načina obdelave vnosa. Ker sem vedel, da ti razredi podpirajo protokol Dallas Semiconductor One-Wire (protokol, ki vključuje dinamične spremembe hitrosti prenosa in popolno preglednost prenesenih bajtov), ​​sem vedel, da mora biti API javax.comm prilagodljiv. Prijetno presenečenje je bilo, kako tesni so bili razredi: imeli so ravno dovolj prilagodljivosti, da so delo opravili, in nič več. Ni bilo skoraj nič nepotrebnega bloatwarea v obliki "metod udobja" ali podpore modemskih protokolov, kot sta Kermit ali xmodem.

Spremljevalni razred do CommPort ali je javax.comm.CommPortIdentifier razred. Ta razred povzema razmerje med poimenovanjem vrat v določenem sistemu (to je "/ dev / ttya" v sistemih Unix in "COM1" v sistemih Windows) in načinom odkrivanja vrat. Statična metoda getCommPortIdentifiers bo seznam vseh znanih komunikacijskih vrat v sistemu; poleg tega lahko za psevdo komunikacijska vrata dodate lastna imena vrat s pomočjo addPortName metoda.

The CommPort razred je dejansko abstrakten in tisto, kar dobite nazaj s klicem openPort v CommPortIdentifier je podrazred CommPort to je bodisi ParallelPort ali SerialPort. Ta dva podrazreda imata dodatne metode, s katerimi lahko nadzirate vrata.

Moč Jave

Lahko se prepirate o resničnosti »piši enkrat, zaženi kjer koli« vse, kar želiš, toda iz izkušenj vam povem, da je za enonitne ali celo preproste večnitne aplikacije, ki niso GUI, Java tam. Če želite napisati program, ki deluje v sistemih Unix, Win32 in Mac in ima dostop do serijskih vrat, potem je Java samo rešitev danes.

Prednost je v tem, da je za vzdrževanje kode, ki deluje na velikem številu platform, potrebnih manj virov - in to zmanjšuje stroške.

Številne aplikacije delijo zahtevo po precej nizkem dostopu do serijskih vrat. Izraz nizka stopnja v tem kontekstu pomeni, da ima program dostop do vmesnikov, ki mu omogočajo sprotno spreminjanje načinov ter neposredno vzorčenje in spreminjanje stanja zatičev strojne opreme za nadzor pretoka. Poleg mojega PDP-8 projekta je Dallas Semiconductor moral uporabljati svoje vmesnike Blue Dot na serijskih vratih za pogovor z iButton z Javo. Poleg tega imajo izdelovalci mikroprocesorjev ocenjevalne plošče, ki uporabljajo serijska vrata za komunikacijo in nalaganje programov. Vse te aplikacije je zdaj mogoče popolnoma in prenosljivo napisati v Javi - kar je zelo močna izjava.

Vsa ta moč za nadzor vzporednih in serijskih vrat gostiteljske naprave prihaja iz knjižnice javax.comm. Če omogočite programerjem Java dostop do vrat, se odpre popolnoma nov nabor aplikacij, ki ciljajo na vgrajene sisteme. V mojem primeru mi je omogočil, da svoj emulator bralnika traku za papir TTY popolnoma napišem v Javi.

Kako se lahko igraš s temi stvarmi?

Če želite dobiti kopijo najnovejše distribucije javax.comm, se morate najprej prijaviti kot razvijalec v povezavi Java Developer Connection (JDC), če tega še niste storili. (Glejte Vire.) JDC je brezplačen in kot član boste dobili zgodnji dostop do razredov Java, ki bodo sčasoma del končnega izdelka.

Odprite razdelek Java Communications API in prenesite najnovejšo arhivsko datoteko javax.comm. Razpakirajte datoteko in namestite knjižnice v skupni rabi (ja, navidezni stroj Java potrebuje izvorno kodo za pogovor s pristanišči - na vašo srečo vam tega ni treba pisati) in namestite datoteko comm.jar. Na koncu dodajte datoteko comm.jar v svoj ZAPRTI spremenljivka.

Ko je datoteka comm.jar shranjena v imeniku lib namestitve Java, win32comm.dll pa v imeniku bin namestitve Java, lahko zberete in zaženete vse primere, ki so priloženi prenosu. Priporočam vam, da si jih ogledate, saj je v izvorno kodo vpletenih veliko dobrih informacij.

Kje to pušča PDP-8?

Torej, kaj se je zgodilo s PDP-8? Mislil sem, da ne boš nikoli vprašal! Ko sem prebral dokument README, ki je prišel z distribucijo javax.comm, nato pa skeniral JavaDocs za paket javax.comm, sem sestavil razred aplikacije z imenom SendTape. Ta razred simulira čitalnik papirnega traku tako, da odpre zaporedna vrata in na njih napolni bajte pri 110 baudih. Koda tega razreda je prikazana tukaj:

uvoz javax.comm. *; uvoz java.io. *; javni razred SendTape {static final int LEADER = 0; statični končni int COLLECT_ADDR = 1; statični končni int COLLECT_DATA = 2; statični končni int COLLECT_DATA2 = 3; / * V tej matriki je kopija nalagalnika formata BIN * / static byte binloader [] = {(bajt) 0x80, (bajt) 0x80, (bajt) 0x80, (bajt) 0x80, ... (bajt) 0x80, ( bajt) 0x80,}; 

Zgornji fragment kode je prvi del datoteke SendTape razred. Ta razred se začne z implicitnim uvozom vseh razredov v paketu javax.comm in paketih java.io. The SendTape class nato definira nekatere konstante in predhodno inicializira bajtno matriko, da vsebuje program BIN Loader, ki sem ga omenil prej. Vključil sem BIN Loader, ker je vedno potreben pri inicializaciji pomnilnika PDP-8 in sem nenehno izgubljal podatke o tem, kje sem nazadnje shranil datoteko s sliko v obliki RIM. S to ključno sliko iz papirnatega traku, ki je na ta način vdelana v razred, jo lahko vedno naložim v ta razred.

 / ** * Ta metoda zažene mini-state stroj, ki * s prenosom daje * uporaben berljiv izpis dogajanja *. * / static int newState (int oldState, bajt b) {...} 

Po inicializaciji imate kodo metode newState, prikazano zgoraj, ki sledi vsebini papirnatega traku (ne glede na to, ali gre za informacije o naslovu ali informacije o programiranju). Zgornja metoda natisne tudi sporočilo za vsako mesto pomnilnika na PDP-8, ki je inicializirano.

Nato imate glavni metoda, ki je prikazana spodaj; odpre datoteko in jo prebere. Nato koda odpre serijska vrata in nastavi svoje komunikacijske parametre.

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