Programavimas

Naujų „Java“ prievadų atidarymas naudojant „javax.comm“

Su javax.comm klasių paketu buvau supažindintas, kai atradau, kad jie buvo naudojami „Java Ring“ kūrimo rinkinyje. (Išsamesnės informacijos apie javax.comm rasite Rinaldo Di Giorgio „Java“ kūrėjas stulpelis gegužės mėnesio numeryje „JavaWorld“: "Java gauna nuoseklų palaikymą naudodama naują javax.comm paketą.") Per beprotišką skubėjimą į "JavaOne", norėdamas įtraukti programą į savo žiedą, susidūriau su įvairiomis problemomis, iš kurių svarbiausia buvo bendrauti su žiedu. Aš atsisiunčiau platinimą iš „Java Developer Connection“ ir nesėkmingai bandžiau jį naudoti kalbėdamasis su „Java Ring“. Vėliau atradau savo žiedo problemą: „Dallas Semiconductor“ senosios API nebuvo tinkamai įdiegtos. Dirbant žiedui, iš esmės pamiršau ryšių paketą. Tai yra, iki maždaug vieno mėnesio savaitgalio, kuris yra šios istorijos atspirties taškas.

Dėl daugelio skirtingų priežasčių (daugiausia susijusių su labai interaktyvia imituota aplinka, pavyzdžiui, žaidimais), mano „laboratorijos“ pagrindiniame kompiuteryje veikia „Windows 95“. Tačiau šį konkretų savaitgalį man labiau rūpėjo kitas kompiuteris, kuris daugeliu atžvilgių buvo maždaug toks pat galingas kaip „Java Ring“: „Digital Equipment Corporation“ PDP-8 / e.

PDP-8 buvo neabejotinai pirmasis tikras asmeninis kompiuteris. Sukurtas 1960-ųjų pabaigoje ir pagamintas palyginti dideliais kiekiais 70-aisiais, PDP-8 galėjo pakelti vienas asmuo, jį maitino 120 voltų linijos srovė ir jis kainavo mažiau nei 0,000. Dauguma šių kompiuterių buvo pristatyti su vienu periferiniu įrenginiu: „Teletype Model ASR-33“ terminalu - originaliu „TTY“ kompiuterių lingu.

AST-33 teletipas buvo spausdinimo terminalas, pateikiamas kartu su popieriaus juostos skaitytuvu ir perforatoriumi. Taip, būtent popierinė juosta, 1 colio popierius su skylutėmis, buvo pagrindinė PDP-8 programų laikmena.

PDP-8 buvo pirmasis mano kada nors užprogramuotas kompiuteris, todėl mano širdyje jis užima ypatingą vietą. Be to, dėl tam tikrų atsitiktinių aplinkybių aš buvau tinkamoje vietoje tinkamu laiku ir sugebėjau išsaugoti PDP-8, kuris buvo pašalintas kaip šiukšlė. Mano prizo nuotrauka parodyta žemiau.

Šį ypatingą savaitgalį ne per seniausiai nusprendžiau atgaivinti PDP-8, kad tik atgaivinčiau tuos brangius ankstyvuosius prisiminimus ir parodyčiau dukrai, kaip gera ji turi su savo „tyliu senu 133 MHz Pentium“. "

Atgaivinti vieną klasiką imituojant kitą

Norėdami pradėti savo atgaivinimo pastangas, turėjau gauti programą į PDP-8. PDP-8 tai pasiekiama atlikus trijų etapų procesą:

  1. Naudodamas priekinio skydelio jungiklius, vartotojas „užrakina“ trumpą programą į magnetinės šerdies atmintį. Ši programa vadinama „RIM Loader“, jos paskirtis - iš popieriaus juostos įkelti kitą programą, kurios formatas yra „Read-in-Mode“ arba „RIM“.

  2. „RIM Loader“ popieriaus juostą įkelia RIM formatu. Šioje juostoje yra programa, vadinama „BIN Loader“, kuri gali įkelti programas iš popieriaus juostos dvejetainiu (BIN) formatu.

  3. Galiausiai paleisdami „BIN Loader“ įkeliate programą, kurios tikrai norite, kuri yra ant BIN formato popierinės juostos. Oi!

Atlikus šiuos tris veiksmus, programa, kurią norite paleisti, saugoma pagrindinėje atmintyje. Tada vartotojui tereikia nustatyti pradinį adresą ir liepti mašinai „eiti“.

Stengiantis atgaivinti mašiną, 1 žingsnis nebuvo problema, tačiau 2 žingsnis buvo susijęs su popieriaus juostos skaitytuvo naudojimu Teletype - aš neturėjau Teletype. Žinoma, aš padarė turiu savo stalinį kompiuterį, todėl logiškas žingsnis buvo imituoti popieriaus juostos skaitytuvą darbalaukyje.

Žiūrint loginiu ir programavimo požiūriu, imituoti popieriaus juostos skaitytuvą yra nereikšminga. Jūs paprasčiausiai perskaitote failą, kuriame yra duomenys iš „juostos“, išsiunčiate juos į nuoseklųjį prievadą 110 baudų (taip, tik 10 simbolių per sekundę), kol baigsite failą. Maždaug per 10 minučių galėčiau parašyti programą C „Solaris“ sistemoje arba „FreeBSD“ sistemoje, kuri tai galėtų padaryti - bet, atminkite, aš naudojau „Windows 95“, o ne „Unix“ sistemą.

Nuo blogo iki negraži ir vėl atgal

Žinojau, kad galiu lengvai parašyti šią programą C kalba, todėl tai buvo mano pasirinkta kalba. Blogas pasirinkimas. Aš atnešiau savo „Visual C ++ 5.0“ kopiją ir išplanavau paprastą programą, pavadintą „sendtape.c“ atviras() ryšių uoste. Aš bandžiau tai nustatyti RAW režimas („Unix“ režimas, kai operacinė sistema nieko nemėgina nuosekliame prievade interpretuoti kaip vartotojo įvestį), tada bandė jį sukompiliuoti. Oi, ne ioctl () funkcija arba tty funkcijos - nada, zip, zilch!

Ne problema, pagalvojau pats: "Aš turiu visą" Microsoft "programinės įrangos kūrėjo tinklo biblioteką kompaktiniame diske su savo C kompiliatoriumi; greitai atliksiu paiešką pagal raktinius žodžius" COM prievadas "."

Paieškos metu atsirado daug nuorodų į „Microsoft Component Object Model“ (dar vadinamą COM), taip pat nuorodų į „MSComm“. „MSComm“ yra C ++ klasė, kurią „Microsoft“ tiekia kalbėdamasis su nuosekliaisiais prievadais. Pažiūrėjau į pavyzdžius ir pasibaisėjau, kiek kodo reikės norint atlikti tokį paprastą dalyką kaip įrašyti baitus į nuoseklųjį prievadą 110 baudų dažniu. Viskas, ką norėjau padaryti, buvo atidaryti išparduotą nuoseklųjį prievadą, nustatyti jo perdavimo greitį ir įdėti jame kelis baitus - nesukurti naujos serijiniu ryšiu patobulintų programų klasės!

Sėdėdamas priešais monitorių buvau „Blue Dot“ receptorius mano „Java“ žiedui, ir aš pagalvojau: „Aha!„ Dallas Semiconductor “žmonės suprato, kaip kalbėti su nuosekliuoju prievadu kompiuteryje. Pažiūrėkime, ką jie daro. " Peržiūrėjus įmonės „Win32“ šaltinio kodą, buvo aišku, kad kalbėjimasis su serijiniais prievadais nebus paprasta užduotis.

Java į pagalbą

Šiuo savaitgalio metu galvojau, kad galėčiau nuvilkti vieną iš savo „Unix“ mašinų į laboratoriją, kad galėčiau užkoduoti programą tai užuot naudojęsis tuo, ką jau turėjau. Tada prisiminiau savo patirtį su „Java Ring“ ir „Sun“ paketu java.comm. Nusprendžiau ieškoti to kelio.

Ką teikia java.comm?

„Java Communications“ API - arba java.comm - suteikia nuo platformos nepriklausomą metodą, kaip pasiekti „Java“ nuoseklius ir lygiagrečius prievadus. Kaip ir naudojant kitas „Java“ API, tokias kaip JFC, JDBC ir „Java 3D“, programuotojas yra priverstas tam tikrą netiesioginį lygį atskirti platformos idėją „kas yra nuoseklusis prievadas“ nuo programavimo modelio. „Javax.comm“ dizaino atveju tokie elementai kaip įrenginių pavadinimai, kurie skiriasi nuo platformos, niekada nenaudojami tiesiogiai. Trys API sąsajos suteikia nepriklausomą platformos prieigą prie nuosekliųjų ir lygiagrečių prievadų. Šios sąsajos teikia metodo skambučius, kad išvardytų galimus ryšių prievadus, valdytų bendrą ir išskirtinę prieigą prie prievadų ir valdytų konkrečias prievado funkcijas, tokias kaip perdavimo sparta, pariteto generavimas ir srauto valdymas.

Kai dokumentacijoje pamačiau „SimpleWrite.java“ pavyzdį ir palyginau jo 40 kodo eilučių su 150–200 eilučių kodu, kurį žiūrėjau rašydamas C, žinojau, kad sprendimas yra prieinamas.

Aukšto lygio šio paketo abstrakcija yra klasė javax.comm.CommPort. „CommPort“ klasė apibrėžia dalykus, kuriuos paprastai darytumėte su uostu, įskaitant gavimą „InputStream“ ir „OutputStream“ objektai, kurie yra prievado įvesties / išvesties kanalai. „CommPort“ klasėje taip pat yra buferio dydžių valdymo ir įvesties tvarkymo koregavimo metodai. Kadangi žinojau, kad šios klasės palaiko „Dallas Semiconductor One-Wire“ protokolą (protokolas, apimantis dinamiškus duomenų perdavimo spartos pokyčius ir visišką perduodamų baitų skaidrumą), žinojau, kad javax.comm API turi būti lanksti. Maloniai nustebino klasių įtempimas: jos turėjo pakankamai lankstumo, kad galėtų atlikti darbą, ir ne daugiau. Mažai nebuvo jokių nereikalingų „bloatware“ programų „patogumo metodais“ arba modemo protokolų, tokių kaip „Kermit“ ar „xmodem“, palaikymu.

Bendruomenės klasė „CommPort“ yra javax.comm.CommPortIdentifier klasė. Ši klasė apibendrina ryšį tarp to, kaip uostas pavadinamas konkrečioje sistemoje (tai yra „/ dev / ttya“ „Unix“ sistemose ir „COM1“ - „Windows“ sistemose) ir kaip atrandami prievadai. Statinis metodas getCommPortIdentifiers surašys visus žinomus sistemos ryšio prievadus; be to, naudodamiesi., galite pridėti savo pseudo ryšio prievadų prievadų pavadinimus addPortName metodas.

„CommPort“ klasė iš tikrųjų yra abstrakti, ir tai, ką jūs gaunate iš iškvietimo „openPort“ viduje konors „CommPortIdentifier“ yra poklasis „CommPort“ tai yra arba „ParallelPort“ arba Nuoseklusis prievadas. Šiuose dviejuose poklasiuose yra papildomų metodų, leidžiančių valdyti patį prievadą.

„Java“ galia

Galite ginčytis dėl realybės: „Rašyk vieną kartą, paleisk bet kur“, ko tik nori, bet aš iš savo patirties pasakysiu, kad „Java“ yra skirta vienos gijos ar net paprastoms daugiagijėms ne GUI programoms. ten. Tiksliau, jei norite parašyti programą, kuri veikia „Unix“, „Win32“ ir „Mac“ sistemose ir gali pasiekti nuoseklųjį prievadą, tada „Java“ yra tik sprendimas šiandien.

Čia yra ta nauda, ​​kad norint išlaikyti kodą, veikiantį daugelyje platformų, reikia mažiau išteklių - ir tai sumažina išlaidas.

Nemažai programų turi bendrą žemo lygio prieigą prie nuoseklaus prievado. Terminas žemas lygis šiame kontekste tai reiškia, kad programa turi prieigą prie sąsajų, leidžiančių skraidant keisti režimus ir tiesiogiai atrinkti bei pakeisti aparatinės įrangos srauto valdymo kaiščių būsenas. Be mano PDP-8 projekto, „Dallas Semiconductor“ turėjo naudoti „Blue Dot“ sąsajas nuosekliuose prievaduose, kad galėtų kalbėtis su „iButton“ su „Java“. Be to, mikroprocesorių gamintojai turi vertinimo lentas, kurios naudoja nuoseklųjį prievadą ryšiams ir programoms įkelti. Visos šios programos dabar gali būti visiškai ir nešiojamai parašytos „Java“ - gana galingas pareiškimas.

Visa ši galia valdyti lygiagrečius ir nuoseklius pagrindinio kompiuterio prievadus gaunama iš javax.comm bibliotekos. Suteikus „Java“ programuotojams prieigą prie prievadų, atsiveria visiškai naujas programų rinkinys, nukreiptas į įdėtas sistemas. Mano atveju tai suteikė galimybę visiškai rašyti savo „TTY“ popieriaus-juostos skaitytuvo emuliatorių „Java“.

Kaip jūs žaidžiate su šia medžiaga?

Norėdami gauti naujausio javax.comm paskirstymo kopiją, pirmiausia turite užsiregistruoti kaip „Java Developer Connection“ (JDC) kūrėjas, jei to dar nepadarėte. (Žr. Išteklius.) JDC yra nemokama, ir kaip narys jūs gausite išankstinę prieigą prie „Java“ klasių, kurios galiausiai taps galutinio produkto dalimi.

Eikite į „Java Communications API“ skyrių ir atsisiųskite naujausią „javax.comm“ archyvo failą. Išpakuokite failą ir įdiekite bendrinamas bibliotekas (taip, „Java“ virtualiai mašinai reikia vietinio kodo, kad būtų galima kalbėti su uostais - jūsų laimei, jums nereikia jo rašyti) ir įdiekite failą „comm.jar“. Galiausiai pridėkite failą comm.jar prie CLASSPATH kintamasis.

Kai failas „comm.jar“ bus išsaugotas jūsų „Java“ diegimo lib kataloge, o win32comm.dll bus saugomas jūsų „Java“ diegimo šiukšliadėžės kataloge, galėsite sudaryti ir paleisti visus su atsisiuntimu susijusius pavyzdžius. Raginu jus juos peržiūrėti, nes prie šaltinio kodo yra daug geros informacijos.

Kur tai palieka PDP-8?

Taigi, kas nutiko su PDP-8? Maniau, kad niekada nepaklausi! Perskaičiusi „README“ dokumentą, kuris buvo pateiktas su „javax.comm“ paskirstymu, tada nuskaitydamas „JavaDocs“ ieškodamas paketo javax.comm, sudėjau programų klasę, vadinamą „SendTape“. Ši klasė imituoja popieriaus juostos skaitytuvą atidarydama nuoseklųjį prievadą ir per jį įdarydama baitus 110 baudų dažniu. Šios klasės kodas rodomas čia:

importuoti javax.comm. *; importuoti java.io. *; viešoji klasė SendTape {static final int LEADER = 0; statinis galutinis int COLLECT_ADDR = 1; statinis galutinis int COLLECT_DATA = 2; statinis galutinis int COLLECT_DATA2 = 3; / * Šiame masyve yra BIN formato krautuvo * / statinio baito kaupiklio kopija [] = {(baitas) 0x80, (baitas) 0x80, (baitas) 0x80, (baitas) 0x80, ... (baitas) 0x80, ( baitas) 0x80,}; 

Aukščiau pateiktas kodo fragmentas yra pirmoji „SendTape“ klasė. Ši klasė prasideda netiesiogiai importuojant visas paketus javax.comm ir paketus java.io. „SendTape“ Tada klasė apibrėžia kai kurias konstantas ir iš anksto inicializuoja baitų masyvą, kad būtų BIN Loader programa, kurią minėjau anksčiau. Įtraukiau „BIN Loader“, nes jo visada reikia inicijuojant PDP-8 atmintį, ir aš vis nepastebėjau, kur paskutinį kartą saugojau failą su jo atvaizdu RIM formatu. Tokiu būdu įterpiant šį svarbų popieriaus juostos vaizdą į klasę, aš visada turiu galimybę jį įkelti į šią klasę.

 / ** * Šis metodas veikia su mažos būsenos mašina, suteikiančia * naudingą žmonėms suprantamą informaciją apie tai, kas vyksta * atsisiunčiant. * / static int newState (int oldState, baitas b) {...} 

Po inicijavimo turite metodo kodą newState, parodyta aukščiau, stebi popierinės juostos turinį (ar tai adreso informacija, ar programavimo informacija). Aukščiau pateiktas metodas taip pat išspausdina pranešimą apie kiekvieną inicializuotą PDP-8 atminties vietą.

Kitas jūs turite pagrindinis metodas, kuris parodytas žemiau; jis atidaro failą ir jį perskaito. Tada kodas atidaro nuoseklųjį prievadą ir nustato jo ryšio parametrus.