Programavimas

„Java“ gauna nuoseklų palaikymą naudodama naują javax.comm paketą

„Java Communications“ (dar žinomas kaip „javax.comm“) API yra siūlomas standartinis plėtinys, leidžiantis ryšių programų autoriams rašyti „Java“ programinę įrangą, kuri prieina prie ryšių prievadų nepriklausomai nuo platformos. Ši API gali būti naudojama terminalo imitavimo programinei įrangai, fakso programinei įrangai, intelektualiųjų kortelių skaitytuvo programinei įrangai ir pan.

Geros programinės įrangos kūrimas paprastai reiškia turėti keletą aiškiai apibrėžtų sąsajų. Aukščiausio lygio API sąsajos sluoksnių schema parodyta šiame paveiksle.

Šiame straipsnyje mes parodysime, kaip naudoti javax.comm norint bendrauti su nuosekliu įrenginiu, pagrįstu RS-232. Taip pat aptarsime, ką suteikia javax.comm API, o ko neteikia. Pateiksime nedidelę programos pavyzdį, kuris parodys, kaip susisiekti su nuosekliuoju prievadu naudojant šią API. Straipsnio pabaigoje mes trumpai išsiaiškinsime, kaip ši javax.comm API veiks su kitomis įrenginių tvarkyklėmis, ir mes peržengsime reikalavimus, susijusius su savosios šios API uosto vykdymu konkrečiai OS.

Skirtingai nuo klasikinių tvarkyklių, kurios yra su savo asinchroninių įvykių komunikacijos modeliais, javax.comm API suteikia įvykio stiliaus sąsają, pagrįstą „Java“ įvykių modeliu (paketas „java.awt.event“). Tarkime, kad norime sužinoti, ar įvesties buferyje nėra naujų duomenų. Tai galime sužinoti dviem būdais - pagal apklausa arba klausantis. Atlikdamas apklausą, procesorius periodiškai tikrina buferį, ar buferyje nėra naujų duomenų. Klausydamas procesorius laukia, kol įvesties buferyje įvykis įvyks kaip nauji duomenys. Kai tik į buferį patenka nauji duomenys, jie procesoriui siunčia pranešimą ar įvykį.

Tarp įvairių prieinamų nuoseklių sąsajų, du populiariausi yra RS-232C ir RS-422 standartai, apibrėžiantys elektros signalo lygius ir įvairių signalo linijų reikšmę. Mažo greičio nuoseklios sąsajos paprastai duomenis perduoda kaip kvadratinę bangą, o laikrodžio koordinavimą užtikrina pradžios ir pabaigos bitai.

RS-232 reiškia Rekomenduoti 232 standartą; C tiesiog nurodo naujausią standarto pataisą. Daugelio kompiuterių nuosekliuose prievaduose naudojamas RS-232C standarto pogrupis. Visas RS-232C standartas nurodo 25 kontaktų „D“ jungtį, iš kurios naudojami 22 kaiščiai. Daugumos šių smeigtukų nereikia įprastam kompiuterio ryšiui, ir iš tikrųjų daugumoje naujų kompiuterių yra vyriškos D tipo jungtys, turinčios tik 9 kaiščius. Daugiau informacijos apie RS-232 rasite skyriuje Ištekliai.

Pastaba: norėdami suprasti, ką kiti vairuotojai padarė praeityje, pažvelkite į „Unix“ termio vadovo puslapį arba „OpenBSD Unix“, BSD Unix tvarkyklės šaltinio variantą. Tai galima nemokamai rasti internete. Daugiau informacijos rasite skyriuje Ištekliai.

„Javax.comm“ API: kas teikiama

„Javax.comm“ API kūrėjams teikia šias funkcijas:

  • Pilna nuosekliojo ir lygiagrečiojo ryšio prievadų API specifikacija. (Šiame straipsnyje mes svarstome tik nuoseklius prievadus.) Jei jūsų kūrimo pastangose ​​nebus bendros API, darbo krūvis padidės, nes turėsite palaikyti serijinius įrenginius.

  • Visiškas visų serijinių kadravimo parametrų (baudos sustabdymo bitų, pariteto, bitų / kadro) valdymas, taip pat rankinis arba automatinis srauto valdymo linijų valdymas. Paprastai RS-232 yra dvi signalo linijos, o likusios yra skirtos valdymo linijoms. Priklausomai nuo ryšio tipo (sinchroninio ar asinchroninio), pasirinktų valdymo linijų skaičius gali skirtis. Ši API suteikia prieigą prie pagrindinių valdymo signalų.

    Trumpas nukrypimas čia gali padėti suprasti ką nors apie paritetą ir pradėti bei sustabdyti. RS-232 buvo pridėtas paritetas, nes ryšio linijos gali būti triukšmingos. Tarkime, mes siunčiame ASCII 0, kuris šešioliktainėmis reikšmėmis yra lygus 0x30 (arba 00110000 dvejetainiais skaičiais), tačiau kelyje kažkas praeina laikydamas magnetą, todėl vienas iš bitų pasikeičia. Todėl vietoj 8 bitų siuntimo, kaip numatyta, prie pirmosios išsiųstų bitų eilutės pridedamas papildomas bitų skaičius, todėl bendra išsiųstų bitų suma yra lygi ar nelyginė. voilà! Jūs turite lygybę.

    Pradinis ir sustabdomasis bitai buvo pridėti prie nuoseklaus ryšio protokolo, kad imtuvai galėtų sinchronizuoti siunčiamus simbolius. Vieno bitų paritetas neleidžia taisyti klaidų - tik aptikti. Šios problemos sprendimo būdai yra protokolai, išdėstyti ant nuosekliosios API. Šiais laikais daugumoje nuoseklių ryšių naudojami blokiniai protokolai su kontrolinėmis sumomis (matematinė funkcija, kurią galima sugeneruoti imtuve ir palyginti su perduodama kontroline suma), leidžiančias aptikti klaidas didesnėse bitų grupėse. Kai bendraujate su savo interneto paslaugų teikėju per PPP, paketai gali būti 128 baitai kiekvienam paketui su kontroline suma. Jei jie sutampa, esate 99.999% tikri, kad duomenys yra tinkami.

    Yra atvejų, kai ši schema neveikia. Pavyzdžiui, siunčiant kritines komandas į prietaisus, kurie yra labai toli nuo Saulės sistemos, pirmyn taisantys protokolai Gali būti naudojamas. Reikalingi pirmyn koreguojantys protokolai, nes retransliacijai gali nebūti laiko, o erdvėje yra daug elektromagnetinio triukšmo.

    Gerai, grįžkite prie funkcijų, kurias teikia javax.comm API, sąrašo!

  • Pagrindinis įvestis / išvestis per „Java IO“ srautų poklasį. Įvestims ir išvestims javax.comm API naudoja srautus; srautų sąvoka turėtų būti žinoma visiems „Java“ programuotojams. Svarbu pakartotinai naudoti „Java“ sąvokas kuriant naują funkcionalumą, arba API taps nepatogi.

  • Srautai, kuriuos galima išplėsti, kad būtų užtikrinta kliento srauto kontrolė ir slenksčio valdymas. Pvz., Galite norėti įspėjimo, kai buferyje yra 10 simbolių arba kai simboliams liko tik 10 vietų. Srauto valdymas yra svarbus, kai du įrenginiai, prijungti per sąsają, negali neatsilikti. Be srauto valdymo galite tai padaryti viršija arba nepakankamas. Esant viršijimo sąlygai, duomenis gavote dar prieš juos apdorodami, todėl jie buvo prarasti; įvykdžius ribą, buvote pasirengę duomenims, bet jų nebuvo. Paprastai šios sąlygos įvyksta USART (universalus sinchroninis asinchroninis imtuvo siųstuvas), tai yra aparatinė įranga, kuri baitus paverčia nuosekliosios bangos forma su laiku, kad atitiktų perdavimo greitį.

    „Javax.comm“ API naudoja „Java“ įvykių modelį, kad praneštų apie įvairius signalo linijos pokyčius ir buferio būseną. Būsenos pokyčiai reiškia tiksliai apibrėžtus signalus, nurodytus RS-232 standarte. Pvz., Nešiklio aptikimą modemas naudoja signalizuodamas, kad jis užmezgė ryšį su kitu modemu, arba aptiko nešlio toną. Ryšio užmezgimas arba nešlio signalo aptikimas yra įvykis. Įvykių aptikimas ir pranešimas apie pakeitimus įgyvendinamas šioje API.

Kas nėra numatyta

„Javax.comm“ API nepateikia:

  • Linijinės drausmės tipo apdorojimas, rinkimo telefono valdymas arba modemo valdymas. Linijinė disciplina reiškia papildomą įvesties ar išvesties simbolių apdorojimą. Pvz., Viena paplitusi vėlesnio apdorojimo galimybė yra CR pavertimas CR LF. Šie terminai atsirado ankstyvaisiais teletipų laikais. CR (vežimo grįžimas) reiškia paprastą grąžinimą vežimui į kairę paraštę; arabų pasaulyje tai būtų tinkama riba. LF (linijinis tiekimas) padidina spausdinimo sritį į viršų. Kai atsirado bitmap ekranai ir lazeriniai spausdintuvai, šie terminai tapo ne tokie svarbūs.

    Dialerio valdymas ir modemo valdymas yra papildomos programos, kurias galima parašyti naudojant javax.comm API. Dialerio valdymas paprastai suteikia sąsają su modemo valdymo AT komandų sąsaja. Beveik visi modemai turi AT komandos sąsają. Ši sąsaja yra dokumentuota modemo vadovuose.

    Galbūt nedidelis pavyzdys paaiškins šią koncepciją. Tarkime, kad COM1 modemą turime ir norime surinkti telefono numerį. „Java“ rinkiklio valdymo programa teirausis telefono numerio ir teirausis modemo. Šias komandas vykdo javax.comm, kuris nėra aiškinamas. Pvz., Norint surinkti numerį 918003210288, telefono rinkėjų valdymas tikriausiai siunčia „AT“, tikėdamasis sugrąžinti „OK“, o po to - ATDT918003210288. Viena iš svarbiausių telefono rinkimo ir modemo valdymo užduočių yra spręsti klaidas ir skirtąjį laiką.

  • Serijinio prievado valdymo GUI. Paprastai nuosekliuose prievaduose yra dialogo langas, kuriame konfigūruojami nuoseklieji prievadai, leidžiantys vartotojams nustatyti tokius parametrus kaip perdavimo sparta, paritetas ir pan. Šioje diagramoje pavaizduoti objektai, susiję su duomenų skaitymu ir (arba) rašymu į nuoseklųjį prievadą iš „Java“.

  • X, Y ir Z modemų protokolų palaikymas. Šie protokolai teikia palaikymo klaidų nustatymą ir taisymą.

Programavimo pagrindai

Labai dažnai programuotojai neria tiesiai į projektą ir interaktyviai koduoja ekrane esančią API, negalvodami apie problemą, kurią bando išspręsti. Norėdami išvengti painiavos ir galimų problemų, prieš pradėdami projektą surinkite šią informaciją. Atminkite, kad programuojant įrenginius paprastai reikia paskaityti vadovą.

  1. Gaukite įrenginio vadovą ir perskaitykite skyrių RS-232 sąsajoje ir RS-232 protokole. Daugelyje įrenginių yra protokolas, kurio reikia laikytis. Šį protokolą nešios javax.comm API ir jis bus pristatytas į įrenginį. Įrenginys iššifruos protokolą, o jūs turėsite daug dėmesio skirti duomenų siuntimui pirmyn ir atgal. Netinkamas pradinis nustatymas gali reikšti, kad jūsų programa nebus paleista, todėl skirkite laiko išbandyti dalykus naudodami paprastą programą. Kitaip tariant, sukurkite programą, kuri gali tiesiog įrašyti duomenis į nuoseklųjį prievadą ir tada skaityti duomenis iš nuoseklaus prievado naudodama javax.comm API.

  2. Pabandykite iš gamintojo gauti keletą kodų pavyzdžių. Net jei jie yra kita kalba, šie pavyzdžiai gali būti gana naudingi.

  3. Suraskite ir užkoduokite mažiausią pavyzdį, kurį galite patikrinti, ar galite bendrauti su įrenginiu. Nuoseklių įrenginių atveju tai gali būti labai skausminga - jūs siunčiate duomenis į įrenginį, prijungtą prie nuoseklaus prievado, ir nieko neįvyksta. Tai dažnai būna neteisingo linijos kondicionavimo rezultatas. Svarbiausia įrenginio programavimo taisyklė (nebent rašote įrenginio tvarkyklę) yra įsitikinti, kad galite bendrauti su įrenginiu. Atlikite tai suradę paprasčiausią dalyką, kurį galite padaryti naudodami savo įrenginį, ir pradėdami tai veikti.

  4. Jei protokolas yra labai sudėtingas, apsvarstykite galimybę įsigyti RS-232 linijinio analizatoriaus programinę įrangą. Ši programinė įranga leidžia pažvelgti į duomenis, judančius tarp dviejų įrenginių RS-232 jungtyje, netrukdant perdavimui.

Norint sėkmingai naudoti javax.comm API programoje, reikia pateikti tam tikro tipo sąsają su įrenginio protokolu, naudojant nuoseklųjį API kaip transportavimo mechanizmą. Kitaip tariant, išskyrus paprasčiausius įrenginius, įrenginio duomenims formatuoti paprastai reikalingas kitas sluoksnis. Žinoma, paprasčiausias protokolas yra „vanilė“ - tai reiškia, kad protokolo nėra. Jūs siunčiate ir gaunate duomenis be aiškinimo.

Siūlomų javax.comm naudojimo veiksmų apžvalga

Be protokolo pateikimo, čia taikomas ir TCP / IP naudojamas ISO sluoksniavimo modelis, nes mes turime elektrinį sluoksnį, po kurio eina labai paprastas baitų perdavimo sluoksnis. Ant šio baitų transporto sluoksnio galite įdėti savo transporto sluoksnį. Pvz., Jūsų PPP kaminas gali naudoti javax.comm API, kad perduotų baitus pirmyn ir atgal į modemą. Javax.comm sluoksnio vaidmuo šiame kontekste yra gana mažas:

  1. Suteikite javax.comm API kai kurių įrenginių valdymą. Prieš naudodamas įrenginį, javax.comm API turi apie tai žinoti.

  2. Atidarykite įrenginį ir kondicionuokite liniją. Galbūt turite įrenginį, kuriam reikalingas 115 kilobitų perdavimo sparta be pariteto.

  3. Parašykite keletą duomenų ir (arba) skaitykite duomenis pagal bet kokį protokolą, kurio reikalauja jūsų įrenginys, su kuriuo bendraujate. Pavyzdžiui, jei prisijungiate prie spausdintuvo, gali reikėti išsiųsti specialų kodą, kad pradėtumėte spausdintuvą ir (arba) baigtumėte darbą. Kai kurie „PostScript“ spausdintuvai reikalauja užbaigti užduotį siunčiant CTRL-D 0x03.

  4. Uždarykite uostą.

Inicializuojamas javax.comm API registras su nuosekliosios sąsajos prievadais

„Javax.comm“ API gali valdyti tik jam žinomus prievadus. Naujausia API versija nereikalauja inicializuoti jokių prievadų. Paleidimo metu javax.comm API nuskaito konkretaus pagrindinio kompiuterio prievadus ir automatiškai juos prideda.

Galite inicializuoti nuoseklius prievadus, kuriuos gali naudoti javax.comm API. Įrenginiuose, kurie nesilaiko standartinės pavadinimų suteikimo tvarkos, galite juos aiškiai pridėti naudodami toliau pateiktą kodų segmentą.

// Užregistruokite įrenginį CommPort ttya = new javax.comm.solaris.SolarisSerial ("ttya", "/ dev / ttya"); CommPortIdentifier.addPort (ttya, CommPortIdentifier.PORT_SERIAL); CommPort ttyb = nauja javax.comm.solaris.SolarisSerial ("ttyb", "/ dev / ttyb"); CommPortIdentifier.addPort (ttyb, CommPortIdentifier.PORT_SERIAL); 

Atidarymo ir kondicionavimo įtaisai

Šis kitas kodo pavyzdys parodo, kaip pridėti, kondicionuoti ir atidaryti įrenginį. Išsami informacija apie konkretaus metodo iškvietimus yra javax.comm API puslapiuose. Šis pavyzdys nustato, kad įrenginys, vadinamas „XYZSerialDevice“, būtų pasiekiamas su pavadinimu „GenericSerialReader“. Šioje linijoje prijungto įrenginio perdavimo greitis yra 9600, 1 stabdymo bitas, 8 bitų simbolis (taip, jie gali būti mažesni) ir nėra pariteto. Viso to rezultatas - pateikti du srautus - vieną skaitymui ir kitą rašymui.