Ohjelmointi

Uusien porttien avaaminen Java-käyttöjärjestelmälle javax.comm

Minulle esiteltiin kurssien javax.comm-paketti, kun huomasin, että niitä käytettiin Java Ring -kehityspaketissa. (Lisätietoja javax.comm -sivustosta, katso Rinaldo Di Giorgio Java-kehittäjä -sarakkeessa toukokuun numerossa JavaWorld: "Java saa sarjatuen uudella javax.comm-paketilla.") Hullun kiireeni aikana JavaOne-ohjelmalla saadaksesi ohjelman soittoalueelleni törmäsin moniin ongelmiin, joista vähiten ei ollut kommunikointia renkaan kanssa. Latasin jakelun Java Developer Connectionista ja yritin epäonnistuneesti käyttää sitä puhuaksesi Java Ring -palveluun. Myöhemmin huomasin renkaassani olevan ongelman: Minulla ei ollut Dallas Semiconductorin vanhoja sovellusliittymiä asennettuna oikein. Kun rengas toimi, unohdin periaatteessa viestintäpaketin. Toisin sanoen noin viikonloppuna noin kuukausi sitten, mikä on tämän tarinan lähtökohta.

Monista eri syistä (enimmäkseen tekemistä erittäin vuorovaikutteisten simuloitujen ympäristöjen - esimerkiksi pelien kanssa) "laboratorioni" ensisijainen tietokone käyttää Windows 95 -käyttöjärjestelmää. Tänä viikonloppuna olin kuitenkin kiinnostunut toisesta tietokoneesta, joka monin tavoin, oli suunnilleen yhtä tehokas kuin Java Ring: Digital Equipment Corporation PDP-8 / e.

PDP-8 oli kiistatta ensimmäinen todellinen henkilökohtainen tietokone. Suunniteltu 1960-luvun lopulla ja tuotettu suhteellisen suurina määrinä 70-luvulla, yksi henkilö pystyi nostamaan PDP-8: n, se sai virtaa 120 voltin linjavirrasta ja maksaa alle 0,000. Suurin osa näistä tietokoneista toimitettiin yhdellä oheislaitteella: Teletype Model ASR-33 -pääte - alkuperäinen "TTY" tietokoneella.

ASR-33-teletyyppi oli tulostuspääte, joka toimitettiin paperinauhalukijan ja rei'ittimen kanssa. Jep, se oli paperinauha, 1 ": n kokoinen paperi, jossa oli reikiä, jotka olivat ensisijainen tallennusväline PDP-8: n ohjelmille.

PDP-8 oli ensimmäinen tietokone, jonka olen koskaan ohjelmoinut, ja siksi sillä on erityinen paikka sydämessäni. Lisäksi joistain satunnaisista olosuhteista johtuen olin oikeassa paikassa oikeaan aikaan ja onnistuin pelastamaan PDP-8: n, joka romutettiin romuksi. Alla on valokuva palkinnostani.

Tänä erityisenä viikonloppuna, joka ei ollut liian kauan sitten, päätin herättää PDP-8: n takaisin eloon, vain saadakseni nämä arvokkaat varhaiset muistot uudelleen ja näyttää tyttärelleni kuinka hyvä hänellä on sen "vanhan tuhkarokkoisen 133 MHz: n Pentiumin kanssa. "

Yhden klassikon elvyttäminen simuloimalla toista

Aloittaakseni herätystyön minun piti hankkia ohjelma PDP-8: een. PDP-8: lla tämä saavutetaan seuraamalla kolmivaiheista prosessia:

  1. Käyttäjä "näppäilee" etupaneelin kytkimien avulla lyhyen ohjelman magneettisen ytimen muistiin. Tätä ohjelmaa kutsutaan RIM Loaderiksi, ja sen tarkoituksena on ladata toinen ohjelma paperinauhalta, joka on Read-in-Mode- tai RIM-muodossa.

  2. RIM Loader lataa paperinauhan RIM-muodossa. Tämä nauha sisältää ohjelman nimeltä BIN Loader, joka voi ladata ohjelmia paperinauhasta binaarimuodossa (BIN).

  3. Lopuksi suoritat BIN Loaderin lataamaan todella haluamasi ohjelman, joka on BIN-muodossa olevalla paperinauhalla. Vau!

Kun olet käynyt läpi nämä kolme vaihetta, suoritettava ohjelma tallennetaan ydinmuistiin. Tämän jälkeen käyttäjän on vain asetettava lähtöosoite ja käskettävä kone "menemään".

Ponnistellessani elvyttämään konetta, vaihe 1 ei ollut ongelma, mutta vaihe 2 liittyi paperinauhalukijan käyttöön telekopiossa - eikä minulla ollut teletyyppiä. Totta kai minä teki on pöytätietokoneeni, joten looginen vaihe oli simuloida paperinauhalukijaa työpöydälläni.

Loogiselta ja ohjelmoinnin kannalta paperinauhalukijan simulointi on vähäpätöistä. Luet yksinkertaisesti tiedoston, joka sisältää "nauhan" tiedot, lähetät sen sarjaporttiin nopeudella 110 baudia (kyllä, vain 10 merkkiä sekunnissa), kunnes tiedosto on käytetty loppuun. Voisin kirjoittaa noin 10 minuutissa Solaris- tai FreeBSD-järjestelmääni C-muodossa ohjelman, joka voisi tehdä tämän - mutta muista, että käytin Windows 95 -järjestelmää, ei Unix-järjestelmää.

Pahasta rumaan ja takaisin

Tiesin, että voin helposti kirjoittaa tämän ohjelman C-muodossa, joten se oli valitsemani kieli. Huono valinta. Nostin Visual C ++ 5.0 -kopioni ja piikkasin yksinkertaisen kutsutun sendtape.c-ohjelman avata() viestintäportissa. Yritin asettaa sen RAAKA mode (tila Unixissa, jossa käyttöjärjestelmä ei yritä tulkita mitään sarjaportista käyttäjän syötteenä) ja yritti sitten kääntää sitä. Hups, ei ioctl () toiminto tai tty toiminnot - nada, zip, zilch!

Ei hätää, ajattelin itsekseni: "Minulla on koko Microsoft-ohjelmistokehittäjän verkkokirjasto CD-levyllä C-kääntäjälläni; teen nopean haun avainsanoista" COM-portti "."

Haun tuloksena syntyi monia viittauksia Microsoft Component Object Model (kutsutaan myös COM: ksi) ja myös viittauksia MSCommiin. MSComm on C ++ -luokka, jonka Microsoft toimittaa puhumaan sarjaporttien kanssa. Katsoin esimerkkejä ja olin järkyttynyt siitä, kuinka paljon koodia tarvitaan tekemään niin yksinkertainen asia kuin tavujen kirjoittaminen sarjaporttiin 110 baudilla. Halusin vain avata halkaistun sarjaportin, asettaa sen siirtonopeuden ja täyttää muutaman tavun sitä - en luoda uutta sarjaviestinnällä parannettujen sovellusten luokkaa!

Näytön edessä istui Java Ring -laitteeni Blue Dot -reseptori, ja ajattelin itsekseni: "Aha! Dallas Semiconductorin ihmiset ovat keksineet, kuinka puhua tietokoneen sarjaportin kanssa. Katsotaanpa, mitä he tekevät. " Tutkittuaan yrityksen Win32-lähdekoodin oli selvää, että sarjaporttien kanssa puhuminen ei ollut yksinkertainen tehtävä.

Java pelastamaan

Tässä viikonloppuni vaiheessa ajattelin ehkä vetää yhden Unix-koneistani laboratorioon koodaamaan ohjelmaa se sen sijaan, että käyttäisin sitä, mikä minulla oli jo. Sitten muistin kokemukseni Java Ringistä ja Sunin java.comm-paketista. Päätin jatkaa sitä tietä.

Mitä java.comm tarjoaa?

Java Communications -sovellusliittymä - tai java.comm - tarjoaa alustasta riippumattoman tavan käyttää sarja- ja rinnakkaisportteja Java-ohjelmasta. Kuten muidenkin Java-sovellusliittymien, kuten JFC, JDBC ja Java 3D, kohdalla ohjelmoija joutuu tietynasteisen suuntaamattomuuden eristämään alustan ajatuksen "mikä sarjaportti on" ohjelmointimallista. Javax.comm-suunnittelun tapauksessa laitteiden nimiä, kuten laitekohtaisia, vaihtelevia laitteita, ei koskaan käytetä suoraan. API: n kolme liitäntää tarjoavat alustalta riippumattoman pääsyn sarja- ja rinnakkaisportteihin. Nämä liitännät tarjoavat menetelmäkutsujen luetteloon käytettävissä olevat tietoliikenneportit, hallitsevat jaettua ja yksinomaista pääsyä portteihin ja ohjaamaan tiettyjä portin ominaisuuksia, kuten siirtonopeutta, pariteetin muodostusta ja vuonohjausta.

Kun näin esimerkin SimpleWrite.java dokumentaatiosta ja verrasin sen 40 koodiriviä 150-200 riviin koodia, jota tarkastelin kirjoittaessani C: ssä, tiesin, että ratkaisu oli käsillä.

Tämän paketin korkean tason abstraktio on luokka javax.comm.CommPort. CommPort luokka määrittelee tyypit, joita tekisit tyypillisesti portin kanssa, mukaan lukien saaminen InputStream ja OutputStream objektit, jotka ovat portin I / O-kanavia. CommPort luokka sisältää myös menetelmiä puskurikokojen hallitsemiseksi ja syötteen käsittelyn säätämiseksi. Koska tiesin, että nämä luokat tukivat Dallas Semiconductor One-Wire -protokollaa (protokolla, joka sisälsi dynaamisia siirtonopeuden muutoksia ja siirrettävien tavujen täydellisen läpinäkyvyyden), tiesin, että javax.comm-sovellusliittymän on oltava joustava. Miellyttävä yllätys oli, kuinka tiukat luokat olivat: Heillä oli vain tarpeeksi joustavuutta työn suorittamiseen eikä enää. Tarpeettomia bloatware-ohjelmia "mukavuusmenetelmien" tai modeemiprotokollien, kuten Kermitin tai xmodemin, muodossa oli vähän tai ei lainkaan.

Seuraluokka CommPort on javax.comm.CommPortIdentifier luokassa. Tämä luokka tiivistää suhteen, kuinka portti nimetään tietyssä järjestelmässä (eli "/ dev / ttya" Unix-järjestelmissä ja "COM1" Windows-järjestelmissä) ja porttien löytämisen välillä. Staattinen menetelmä getCommPortIdentififier luetteloi kaikki tunnetut tiedonsiirtoportit järjestelmässä; Lisäksi voit lisätä omat porttinimesi näennäisviestintäportteihin käyttämällä addPortName menetelmä.

CommPort luokka on itse asiassa abstrakti, ja mitä saat takaisin kutsusta openPort että CommPortIdentifier on ryhmän alaluokka CommPort se on joko Rinnakkaisportti tai Sarjaportti. Näillä kahdella alaluokalla on kullakin muita menetelmiä, joiden avulla voit hallita itse porttia.

Java-voiman

Voit kiistellä "kirjoita kerran, aja mihin tahansa" todellisuudesta, mutta sanon kokemuksestani, että Java on yksi- tai jopa yksinkertaisten monisäikeisten ei-GUI-sovellusten kohdalla. siellä. Erityisesti, jos haluat kirjoittaa ohjelman, joka toimii Unix-, Win32- ja Mac-järjestelmissä ja voi käyttää sarjaporttia, Java on vain ratkaisu tänään.

Etu tässä on se, että monilla alustoilla suoritettavan koodin ylläpitoon tarvitaan vähemmän resursseja - ja tämä vähentää kustannuksia.

Monilla sovelluksilla on vaatimus melko matalalle tasolle pääsystä sarjaporttiin. Termi matala taso tässä yhteydessä tarkoittaa, että ohjelmalla on pääsy rajapintoihin, joiden avulla se voi vaihtaa tilaa lennon aikana ja ottaa suoraan näytteitä ja muuttaa laitteiston virtauksen ohjaustappien tilaa. PDP-8-projektini lisäksi Dallas Semiconductor tarvitsi käyttää Blue Dot -rajapintojaan sarjaportteissa puhuakseen iButtonille Java-palvelimella. Lisäksi mikroprosessorien valmistajilla on arviointilevyt, jotka käyttävät sarjaporttia viestintään ja ohjelmien lataamiseen. Kaikki nämä sovellukset voidaan nyt kirjoittaa kokonaan ja kannettavasti Java-muodossa - melko voimakas lausunto.

Kaikki tämä teho isäntäkoneen rinnakkais- ja sarjaporttien ohjaamiseen tulee javax.comm-kirjastosta. Java-ohjelmoijille pääsyn myöntäminen portteihin avaa kokonaan uuden sovellussarjan, joka kohdistuu sulautettuihin järjestelmiin. Minun tapauksessani se antoi minulle mahdollisuuden kirjoittaa TTY-paperinauhalukijaemulaattorini kokonaan Java-muodossa.

Kuinka pääset pelaamaan näitä juttuja?

Saadaksesi kopion uusimmasta javax.comm-jakelusta, sinun on ensin kirjauduttava Java Developer Connection (JDC) -kehittäjäksi, jos et ole vielä tehnyt niin. (Katso Resurssit.) JDC on ilmainen, ja jäsenenä saat varhaisen pääsyn Java-luokkiin, jotka lopulta ovat osa lopputuotetta.

Siirry Java Communications -sovellusliittymän osioon ja lataa uusin javax.comm-arkistotiedosto. Pura tiedosto ja asenna jaetut kirjastot (kyllä, Java-virtuaalikone tarvitsee natiivikoodin puhuakseen porttien kanssa - onneksi sinun ei tarvitse kirjoittaa sitä) ja asenna comm.jar-tiedosto. Lisää lopuksi comm.jar-tiedosto omaan tiedostoon CLASSPATH muuttuja.

Kun comm.jar-tiedosto on tallennettu Java-asennuksesi lib-hakemistoon ja win32comm.dll on tallennettu Java-asennuksesi bin-hakemistoon, voit koota ja suorittaa kaikki latauksen mukana tulevat esimerkit. Kehotan teitä tarkastelemaan niitä, koska lähdekoodin sisällä on paljon hyvää tietoa.

Mihin tämä jättää PDP-8: n?

Joten mitä tapahtui PDP-8: n kanssa? Luulin, ettet koskaan kysy! Luettuani javax.comm-jakelun mukana toimitetun README-asiakirjan ja skannattuani JavaDocs javax.comm-paketin, kootin sovellusluokan nimeltä Lähetä nauha. Tämä luokka simuloi paperinauhalukijaa avaamalla sarjaportin ja täyttämällä tavuja sen yli 110 baudilla. Tämän luokan koodi näkyy tässä:

tuo javax.comm. *; tuo java.io. *; julkinen luokka SendTape {staattinen lopullinen int LEADER = 0; staattinen lopullinen int COLLECT_ADDR = 1; staattinen lopullinen int COLLECT_DATA = 2; staattinen lopullinen int COLLECT_DATA2 = 3; / * Tämä taulukko sisältää kopion BIN-muotoisen lataimen * / staattisesta tavusta binloaderista [] = {(tavu) 0x80, (tavu) 0x80, (tavu) 0x80, (tavu) 0x80, ... (tavu) 0x80, ( tavu) 0x80,}; 

Yllä oleva koodifragmentti on Lähetä nauha luokassa. Tämä luokka alkaa implisiittisesti tuomalla kaikki javax.comm- ja java.io-pakettien luokat. Lähetä nauha class sitten määrittelee joitain vakioita ja alustaa tavujärjestelmän valmiiksi sisältämään aiemmin mainitsemani BIN Loader -ohjelman. Lisäsin BIN-latauslaitteen, koska sitä tarvitaan aina PDP-8: n muistia alustettaessa ja kadotin jatkuvasti, mihin olin viimeksi tallentanut tiedoston, joka sisälsi sen kuvan RIM-muodossa. Tämän luokalle tällä tavalla upotetun tärkeän paperinauhakuvan ansiosta minulla on aina mahdollisuus ladata se tähän luokkaan.

 / ** * Tämä menetelmä käyttää minitilakonetta, joka antaa * hyödyllisen ihmisen luettavissa olevan tuloksen siitä, mitä latauksessa tapahtuu. * / staattinen int newState (int oldState, tavu b) {...} 

Alustamisen jälkeen sinulla on menetelmän koodi newState, joka osoittaa yllä, joka seuraa paperinauhan sisältöä (olipa kyse sitten osoitetiedoista tai ohjelmointitiedoista). Yllä oleva menetelmä tulostaa myös viestin jokaiselle alustetulle PDP-8-muistin sijainnille.

Seuraavaksi sinulla on tärkein menetelmä, joka on esitetty alla; se avaa tiedoston ja lukee sen sisään. Sitten koodi avaa sarjaportin ja asettaa sen tiedonsiirtoparametrit.

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