Programmēšana

Jaunu portu atvēršana Java ar javax.comm

Es biju iepazīstināts ar javax.comm klašu paketi, kad atklāju, ka tās tika izmantotas Java Ring izstrādes komplektā. (Sīkāku informāciju vietnē javax.comm skatiet Rinaldo Di Giorgio Java izstrādātājs sleja maija numurā JavaWorld: "Java saņem sērijveida atbalstu ar jauno javax.comm pakotni.") Manā neprātīgajā skriešanās laikā pie JavaOne, lai iegūtu programmu manā gredzenā, man radās dažādas problēmas, no kurām ne mazāk svarīga bija saziņa ar gredzenu. Es lejupielādēju izplatīšanu no Java Developer Connection un neveiksmīgi mēģināju to izmantot sarunai ar Java Ring. Vēlāk es atklāju problēmu ar savu gredzenu: man nebija pareizi instalētas Dallas Semiconductor mantotās API. Strādājot gredzenam, es būtībā aizmirsu par sakaru paketi. Tas ir, līdz vienai nedēļas nogalei apmēram pirms mēneša, kas ir šī stāsta sākumpunkts.

Daudzu dažādu iemeslu dēļ (galvenokārt tas ir saistīts ar ļoti interaktīvām simulētām vidēm, piemēram, spēlēm), manā "laboratorijā" primārajā datorā darbojas operētājsistēma Windows 95. Tomēr šajā konkrētajā nedēļas nogalē es vairāk rūpējos par citu datoru, kas daudzos veidos bija aptuveni tikpat spēcīgs kā Java gredzens: Digital Equipment Corporation PDP-8 / e.

PDP-8 neapšaubāmi bija pirmais īstais personālais dators. Paredzēts 1960. gadu beigās un ražots salīdzinoši lielos daudzumos 70. gados, PDP-8 varēja pacelt viens cilvēks, to darbināja ar 120 voltu līnijas strāvu un maksāja mazāk nekā 0,000. Lielākā daļa šo datoru tika piegādāti ar vienu perifērijas ierīci: Teletype Model ASR-33 terminālu - oriģinālo "TTY" datoru lingo.

ASR-33 teletips bija drukas terminālis, kas piegādāts kopā ar papīra lentu lasītāju un perforatoru. Jā, tā bija papīra lente, 1 collu papīrs ar caurumiem, kas bija PDP-8 programmu primārais datu nesējs.

PDP-8 bija pirmais dators, ko jebkad esmu ieprogrammējis, un tāpēc manā sirdī tam ir īpaša vieta. Dažu nejaušu apstākļu dēļ es atrados īstajā laikā un īstajā laikā, un man izdevās ietaupīt PDP-8, kas tiks nodots metāllūžņos. Manas balvas fotogrāfija ir parādīta zemāk.

Šajā īpašajā nedēļas nogalē, kas notika ne pārāk sen, es nolēmu atdzīvināt PDP-8, kaut vai tāpēc, lai atdzīvinātu šīs dārgās agrīnās atmiņas un parādītu meitai, cik labi viņai tas ir ar savu "masalaino veco 133 MHz Pentium". "

Atdzīvinot vienu klasiku, simulējot citu

Lai sāktu atdzīvināšanas centienus, man bija jāiegūst programma PDP-8. Izmantojot PDP-8, tas tiek panākts, veicot trīspakāpju procesu:

  1. Izmantojot priekšējā paneļa slēdžus, lietotājs “ieslēdz” īsu programmu magnētiskā kodola atmiņā. Šo programmu sauc par RIM Loader, un tās mērķis ir ielādēt citu programmu no papīra lentes, kas ir režīmā Read-in-Mode vai RIM.

  2. RIM Loader papīra lenti ielādē RIM formātā. Šajā lentē ir programma ar nosaukumu BIN Loader, kas var ielādēt programmas no papīra lentes binārā (BIN) formātā.

  3. Visbeidzot, jūs palaižat BIN Loader, lai ielādētu programmu, kuru patiešām vēlaties, kas atrodas uz papīra lentes BIN formātā. Whee!

Pēc šo trīs darbību veikšanas programma, kuru vēlaties palaist, tiek saglabāta pamata atmiņā. Pēc tam lietotājam ir jādara tikai sākuma adrese un jāpasaka mašīnai "iet".

Cenšoties atdzīvināt mašīnu, 1. solis nebija problēma, bet 2. solis bija saistīts ar papīra lentes lasītāja izmantošanu teletipā - un man nebija teletipa. Protams, es darīja ir mans galddators, tāpēc loģisks solis bija simulēt papīra lentes lasītāju uz mana darbvirsmas.

No loģiskā un programmēšanas viedokļa papīra lentu lasītāja simulēšana ir maznozīmīga. Jūs vienkārši izlasāt failu, kurā ir dati no "lentes", un nosūtiet tos uz seriālo portu ar ātrumu 110 baudu (jā, tikai 10 rakstzīmes sekundē), līdz fails ir izsmelts. Es apmēram 10 minūšu laikā es varētu uzrakstīt programmu C savā Solaris sistēmā vai FreeBSD sistēmā, kas to varētu izdarīt, taču, atcerieties, ka es izmantoju Windows 95 sistēmu, nevis Unix sistēmu.

No slikta līdz neglītam un atkal atpakaļ

Es zināju, ka varu viegli uzrakstīt šo programmu C, tāpēc tā bija mana izvēlētā valoda. Slikta izvēle. Es izaudzināju savu Visual C ++ 5.0 kopiju un izvilku vienkāršu programmu, ko sauca sendtape.c atvērts () sakaru ostā. Es mēģināju to iestrādāt RAW režīms (režīms Unix, kurā operētājsistēma nemēģina seriālajā portā neko interpretēt kā lietotāja ievadi) un pēc tam mēģināja to apkopot. Nē ioctl () funkcija vai tty funkcijas - nada, zip, zilch!

Nav problēmu, es pie sevis nodomāju: "Man ir visa Microsoft programmatūras izstrādātāja tīkla bibliotēka kompaktdiskā ar savu C kompilatoru; es ātri meklēšu atslēgvārdus" COM ports "."

Veicot meklēšanu, tika atrastas daudzas atsauces uz Microsoft komponentu objektu modeli (saukts arī par COM), kā arī atsauces uz MSComm. MSComm ir C ++ klase, kuru Microsoft piegādā sarunai ar seriālajiem portiem. Es apskatīju piemērus un biju satriekts par to, cik daudz koda vajadzēs, lai izdarītu tik vienkāršu lietu kā rakstīt baitus seriālajā portā ar 110 bodu. Viss, ko es gribēju darīt, bija atvērt iedragāto seriālo portu, iestatīt tā pārraides ātrumu un ievietot tajā dažus baitus - neveidot jaunu sērijveida sakaru uzlabotu lietojumprogrammu klasi!

Sēžot pie mana monitora, bija Blue Dot receptors manam Java Ring, un es pie sevis nodomāju: "Aha! Dalasas Semiconductor ļaudis ir izdomājuši, kā runāt ar seriālo portu datorā. Paskatīsimies, ko viņi dara. " Izskatot uzņēmuma Win32 pirmkodu, bija skaidrs, ka saruna ar seriālajiem portiem nebūs vienkāršs uzdevums.

Java glābšanai

Šajā nedēļas nogalē es domāju, ka es varētu vilkt vienu no savām Unix mašīnām uz laboratoriju, lai kodētu programmu to tā vietā, lai izmantotu to, kas man jau bija. Tad es atcerējos savu pieredzi ar Java Ring un java.comm paketi no Sun. Es nolēmu tā vietā meklēt šo avēniju.

Ko nodrošina java.comm?

Java Communications API - vai java.comm - nodrošina no platformas neatkarīgu metodi, kā piekļūt sērijveida un paralēlajiem portiem no Java. Tāpat kā ar citiem Java API, piemēram, JFC, JDBC un Java 3D, arī programmētājs ir spiests noteikt noteiktu virzienu, lai platformas ideju par "kas ir seriālais ports" izolētu no programmēšanas modeļa. Javax.comm dizaina gadījumā tādi objekti kā ierīču nosaukumi, kas dažādās platformās atšķiras, nekad netiek tieši izmantoti. Trīs API saskarnes nodrošina no platformas neatkarīgu piekļuvi seriālajiem un paralēlajiem portiem. Šīs saskarnes nodrošina metožu izsaukumus, lai uzskaitītu pieejamos sakaru portus, kontrolētu kopīgu un ekskluzīvu piekļuvi ostām un kontrolētu īpašas ostas funkcijas, piemēram, datu pārraides ātrumu, paritātes ģenerēšanu un plūsmas kontroli.

Kad es dokumentācijā ieraudzīju SimpleWrite.java piemēru un salīdzināju tā 40 koda rindas ar 150 līdz 200 koda rindiņām, kuras meklēju rakstot C, es zināju, ka risinājums ir pie rokas.

Šīs paketes augsta līmeņa abstrakcija ir klase javax.comm.CommPort. The CommPort klase nosaka veidu, ko jūs parasti darāt ar portu, kas ietver iegūšanu InputStream un OutputStream objekti, kas ir porta I / O kanāli. The CommPort klase ietver arī metodes bufera izmēru kontrolei un ievades apstrādes pielāgošanai. Tā kā es zināju, ka šīs klases atbalsta Dallas Semiconductor One-Wire protokolu (protokols, kas saistīts ar dinamiskām datu pārraides ātruma izmaiņām un pilnīgu pārsūtāmo baitu pārredzamību), es zināju, ka javax.comm API ir jābūt elastīgam. Kā patīkams pārsteigums bija tas, cik klases bija saspringtas: viņiem bija pietiekami daudz elastības, lai paveiktu darbu, un ne vairāk. Bija maz vai vispār nevajadzīga bloatware "ērtības metožu" veidā vai tādu modemu protokolu kā Kermit vai xmodem atbalstīšanas veidā.

Pavadošā klase CommPort ir javax.comm.CommPortIdentifier klasē. Šī klase apkopo saikni starp to, kā ports tiek nosaukts noteiktā sistēmā (tas ir, "/ dev / ttya" Unix sistēmās un "COM1" Windows sistēmās) un to, kā tiek atklāti porti. Statiskā metode getCommPortIdentifiers uzskaitīs visas zināmās sistēmas sakaru ostas; turklāt jūs varat pievienot savus portu nosaukumus pseido sakaru portiem, izmantojot addPortName metodi.

The CommPort klase faktiski ir abstrakta, un tas, ko jūs atgūstat pēc piesaukšanas openPort iekš CommPortIdentifier ir apakšklase CommPort tas ir vai nu ParallelPort vai SerialPort. Šīm abām apakšklasēm katrā ir papildu metodes, kas ļauj kontrolēt pašu portu.

Java spēks

Jūs varat strīdēties par realitāti "rakstīt vienreiz, palaist jebkur", bet visu, ko es vēlos pateikt, es jums pastāstīšu no pieredzes, ka Java ar vienu pavedienu vai pat vienkāršām daudzu pavedienu bez GUI lietojumprogrammām tur. Ja vēlaties rakstīt programmu, kas darbojas Unix, Win32 un Mac sistēmās un var piekļūt seriālajam portam, tad Java ir tikai risinājums šodien.

Ieguvums ir tāds, ka koda uzturēšanai, kas darbojas lielā skaitā platformu, ir nepieciešams mazāk resursu - un tas samazina izmaksas.

Daudzām lietojumprogrammām ir kopīga prasība, lai būtu diezgan zema līmeņa piekļuve seriālajam portam. Termiņš zems līmenis šajā kontekstā nozīmē, ka programmai ir piekļuve saskarnēm, kas ļauj tai mainīt lidojuma režīmus un tieši atlasīt un mainīt aparatūras plūsmas vadības tapu stāvokļus. Papildus manam PDP-8 projektam Dalasas pusvadītājam bija jāizmanto tās Blue Dot saskarnes seriālajos portos, lai sarunātos ar iButton ar Java. Turklāt mikroprocesoru veidotājiem ir novērtēšanas dēļi, kas saziņai un programmu ielādēšanai izmanto seriālo portu. Visas šīs lietojumprogrammas tagad var pilnībā un pārnēsājami rakstīt Java valodā - diezgan spēcīgs paziņojums.

Visa šī spēja kontrolēt resursdatora paralēlo un seriālo portu nāk no javax.comm bibliotēkas. Piešķirot Java programmētājiem piekļuvi ostām, tiek atvērts pilnīgi jauns lietojumprogrammu kopums, kura mērķauditorija ir iegultās sistēmas. Manā gadījumā tas man deva iespēju pilnībā rakstīt savu TTY papīra lentu lasītāju emulatoru Java valodā.

Kā jūs spēlējaties ar šīm lietām?

Lai iegūtu jaunākā javax.comm izplatījuma kopiju, vispirms jums jāreģistrējas kā Java Developer Connection (JDC) izstrādātājam, ja vēl neesat to izdarījis. (Skatīt resursus.) JDC ir bezmaksas, un kā dalībnieks jūs agri piekļūsiet Java klasēm, kas galu galā būs daļa no galaprodukta.

Dodieties uz Java Communications API sadaļu un lejupielādējiet jaunāko javax.comm arhīva failu. Izpakojiet failu un instalējiet koplietojamās bibliotēkas (jā, Java virtuālajai mašīnai ir nepieciešams vietējais kods, lai sarunātos ar ostām - par laimi, jums tas nav jāraksta) un instalējiet failu comm.jar. Visbeidzot, pievienojiet failu comm.jar savam failam CLASSPATH mainīgais.

Kad comm.jar fails ir saglabāts jūsu Java instalācijas lib direktorijā un win32comm.dll ir saglabāts jūsu Java instalācijas atkritumu direktorijā, varat apkopot un palaist visus piemērus, kas pievienoti lejupielādei. Es iesaku jums tos apskatīt, jo avota kodā ir daudz labas informācijas.

Kur tas atstāj PDP-8?

Tātad, kas notika ar PDP-8? Es domāju, ka jūs nekad nejautāsiet! Izlasījis README dokumentu, kas tika piegādāts kopā ar javax.comm, pēc tam skenējot JavaDocs pakotnei javax.comm, es izveidoju lietojumprogrammas klasi ar nosaukumu SendTape. Šī klase simulē papīra lentes lasītāju, atverot seriālo portu un aizpildot to baitus ar 110 bodu. Šīs klases kods ir parādīts šeit:

importēt javax.comm. *; importēt java.io. *; publiskā klase SendTape {static final int LEADER = 0; statiskais gala int COLLECT_ADDR = 1; statiskais gala int COLLECT_DATA = 2; statiskais gala int COLLECT_DATA2 = 3; / * Šajā masīvā ir BIN formāta iekrāvēja kopija * / statiskā baita binloader [] = {(baits) 0x80, (baits) 0x80, (baits) 0x80, (baits) 0x80, ... (baits) 0x80, ( baits) 0x80,}; 

Iepriekš minētais koda fragments ir SendTape klasē. Šī klase sākas, netieši importējot visas paketes javax.comm un java.io esošās klases. The SendTape Pēc tam klase definē dažas konstantes un sākotnēji inicializē baitu masīvu, lai saturētu iepriekšminēto BIN Loader programmu. Es iekļāvu BIN iekrāvēju, jo tas vienmēr ir nepieciešams, inicializējot PDP-8 atmiņu, un es turpināju pazaudēt vietu, kur pēdējo reizi biju glabājis failu ar tā attēlu RIM formātā. Ar šo klasē šādā veidā iegulto izšķirošo papīra lentes attēlu man vienmēr ir iespēja to ielādēt šajā klasē.

 / ** * Šī metode darbojas ar mini-state mašīnu, kas nodrošina * noderīgu cilvēka lasāmu rezultātu par notiekošo * ar lejupielādi. * / static int newState (int oldState, bait b) {...} 

Pēc inicializācijas jums ir metodes kods newState, kas parādīts iepriekš, kas izseko papīra lentes saturu (neatkarīgi no tā, vai tā ir adrese vai programmēšanas informācija). Iepriekš aprakstītā metode arī izdrukā ziņojumu par katru inicializēto atmiņas vietu PDP-8.

Tālāk jums ir galvenais metode, kas parādīta zemāk; tas atver failu un nolasa to. Pēc tam kods atver seriālo portu un nosaka tā komunikācijas parametrus.

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