Programmēšana

Java saņem sērijveida atbalstu ar jauno javax.comm pakotni

Java Communications (a.k.a. javax.comm) API ir ierosinātais standarta paplašinājums, kas ļauj sakaru lietojumprogrammu autoriem rakstīt Java programmatūru, kas piekļūst sakaru portiem neatkarīgi no platformas. Šo API var izmantot, lai rakstītu termināļa emulācijas programmatūru, faksa programmatūru, viedkaršu lasītāja programmatūru un tā tālāk.

Labas programmatūras izstrāde parasti nozīmē dažas skaidri definētas saskarnes. API saskarnes slāņu augsta līmeņa diagramma ir parādīta šajā attēlā.

Šajā rakstā mēs parādīsim, kā izmantot javax.comm, lai sazinātos ar seriālo ierīci, kuras pamatā ir RS-232. Mēs arī apspriedīsim, ko nodrošina javax.comm API un ko tas nenodrošina. Mēs parādīsim nelielu programmas piemēru, kas parāda, kā sazināties ar seriālo portu, izmantojot šo API. Raksta beigās mēs īsi sīki aprakstīsim, kā šī javax.comm API darbosies ar citiem ierīču draiveriem, un mēs pārskatīsim prasības, kas jāveic, lai šī API vietējais ports tiktu izpildīts konkrētā OS.

Atšķirībā no klasiskajiem draiveriem, kuriem ir savi asinhrono notikumu komunikācijas modeļi, javax.comm API nodrošina notikumu stila saskarni, kuras pamatā ir Java notikumu modelis (pakete java.awt.event). Pieņemsim, ka mēs vēlamies uzzināt, vai ievades buferī ir kādi jauni dati. Mēs to varam uzzināt divos veidos - pēc aptauja vai klausoties. Veicot aptauju, procesors periodiski pārbauda buferi, lai redzētu, vai buferī ir jauni dati. Klausoties, procesors gaida notikumu jaunu datu veidā ievades buferī. Tiklīdz buferī nonāk jauni dati, tie procesoram nosūta paziņojumu vai notikumu.

Starp dažādajiem pieejamajiem seriālajiem interfeisiem divi no populārākajiem ir RS-232C un RS-422 standarti, kas nosaka elektrisko signālu līmeņus un dažādu signālu līniju nozīmi. Zema ātruma sērijveida saskarnes parasti pulksteņa datus izraksta kā kvadrātveida viļņus, ar pulksteņa koordināciju nodrošina sākuma un apturēšanas biti.

RS-232 apzīmē Ieteikt 232. standartu; C vienkārši atsaucas uz jaunāko standarta pārskatīšanu. Sērijas portos lielākajā daļā datoru tiek izmantots RS-232C standarta apakškopa. Pilns RS-232C standarts nosaka 25 kontaktu "D" savienotāju, no kura tiek izmantoti 22 kontakti. Lielākā daļa šo tapu nav vajadzīgas normālai personālajai personālajai saziņai, un patiešām lielākā daļa jauno datoru ir aprīkoti ar vīriešu D tipa savienotājiem, kuriem ir tikai 9 tapas. Plašāku informāciju par RS-232 skatiet sadaļā Resursi.

Piezīme. Lai saprastu, ko citi draiveri ir darījuši agrāk, ieskatieties Unix termio rokasgrāmatas lapa vai OpenBSD Unix, BSD Unix draivera avota variācija. Tas ir pieejams bez maksas internetā. Lūdzu, skatiet sadaļu Resursi, lai iegūtu vairāk informācijas.

Javax.comm API: kas tiek nodrošināts

Javax.comm API izstrādātājiem nodrošina šādu funkcionalitāti:

  • Pilnīga API specifikācija sērijveida un paralēlajiem sakaru portiem. (Šajā rakstā mēs aplūkojam tikai seriālos portus.) Bez kopīgas API izstrādes darbos slodze palielināsies, jo jums būs jāsniedz atbalsts sērijveida ierīcēm.

  • Pilnīga visu sērijveida kadrēšanas parametru (bauda stop bitu, paritātes, bitu / kadra) kontrole, kā arī plūsmas vadības līniju manuāla vai automātiska vadība. Parasti RS-232 ir divas signāla līnijas, bet pārējās ir paredzētas vadības līnijām. Atkarībā no komunikācijas veida (sinhrona vai asinhrona) izvēlēto vadības līniju skaits var atšķirties. Šī API nodrošina piekļuvi pamatā esošajiem vadības signāliem.

    Īss novirzīšanās šeit var palīdzēt jums kaut ko saprast paritāti, kā arī sākt un apturēt bitus. RS-232 tika pievienota paritāte, jo sakaru līnijas var būt trokšņainas. Pieņemsim, ka mēs nosūtām ASCII 0, kas sešstūrī ir vienāds ar 0x30 (vai 00110000 binārā formātā), bet pa ceļam kāds iet garām, turot magnētu, kā rezultātā viens no bitiem mainās. Rezultātā tā vietā, lai nosūtītu 8 bitus, kā paredzēts, pirmajai nosūtīto bitu virknei tiek pievienots papildu bits, padarot nosūtīto bitu kopsummu par pāra vai nepāra. voilà! Jums ir paritāte.

    Sākuma un beigu biti tika pievienoti sērijveida sakaru protokolam, lai uztvērēji varētu sinhronizēt nosūtāmās rakstzīmes. Viena bita paritāte nepieļauj kļūdu labošanu - tikai noteikšanu. Šīs problēmas risinājumi rodas no protokoliem, kas ir slāņoti virs sērijas API. Mūsdienās lielākajā daļā sērijveida sakaru tiek izmantoti bloku protokoli ar kontrolsummām (matemātiska funkcija, ko var ģenerēt uztvērējā un salīdzināt ar pārsūtīto kontrolsummu), kas ļauj atklāt kļūdas lielākām bitu grupām. Sazinoties ar savu ISP, izmantojot PPP, paketes var būt 128 baiti vienā paketē ar kontrolsummu. Ja tie sakrīt, jūs esat par 99,999% pārliecināts, ka dati ir pareizi.

    Ir gadījumi, kad šī shēma nedarbojas. Piemēram, nosūtot kritiskas komandas ierīcēm, kas atrodas ļoti tālu Saules sistēmā, labošanas protokoli uz priekšu Var izmantot. Nepieciešami uz priekšu vērsti labošanas protokoli, jo retranslācijai var nebūt laika, un kosmosā ir daudz elektromagnētiskā trokšņa.

    Labi, atgriezieties pie javax.comm API sniegto funkciju saraksta!

  • Pamata I / O caur Java IO plūsmu apakšklasi. Ievadei un izvadei javax.comm API izmanto straumes; straumes jēdzienam jābūt pazīstamam visiem Java programmētājiem. Ja tiek veidota jauna funkcionalitāte, ir svarīgi atkārtoti izmantot Java koncepcijas, jo pretējā gadījumā API kļūs apgrūtinoša.

  • Straumes, kuras var paplašināt, lai nodrošinātu klienta plūsmas kontroli un sliekšņa vadību. Piemēram, jūs varat vēlēties brīdinājumu, ja buferī ir 10 rakstzīmes vai ja rakstzīmēm ir atlikušas tikai 10 vietas. Plūsmas kontrole ir svarīga, ja abas ierīces, kas savienotas, izmantojot interfeisu, nespēj sekot līdzi viena otrai. Bez plūsmas kontroles jūs varat pārsniegšana vai nepietiekami. Pārsniegšanas stāvoklī jūs saņēmāt datus pirms to apstrādes, tāpēc tie tika zaudēti; pabraukšanas laikā jūs bijāt gatavs datiem, taču tie nebija pieejami. Parasti šie apstākļi rodas USART (universālā sinhronā asinhronā uztvērēja raidītājā), kas ir aparatūra, kas baitus pārvērš sērijas viļņu formā ar laiku, lai tas atbilstu pārraides ātrumam.

    Javax.comm API izmanto Java notikumu modeli, lai sniegtu paziņojumus par dažādām signāla līnijas izmaiņām, kā arī bufera statusu. Stāvokļa izmaiņas attiecas uz precīzi definētiem signāliem, kas norādīti RS-232 standartā. Piemēram, nesēju noteikšanu modems izmanto, lai norādītu, ka tas ir izveidojis savienojumu ar citu modemu, vai arī tas ir atklājis nesēja signālu. Savienojuma izveide vai nesēja signāla noteikšana ir notikums. Šajā API ir ieviesta notikumu noteikšana un izmaiņu paziņošana.

Kas nav paredzēts

Javax.comm API nesniedz:

  • Līnijas disciplīnas veida apstrāde, zvanītāju pārvaldība vai modema pārvaldība. Līnijas disciplīna attiecas uz ievades vai izvades rakstzīmju papildu apstrādi. Piemēram, viena izplatīta pēcapstrādes iespēja ir CR pārveidošana par CR LF. Šo terminu izcelsme ir teletipu sākuma dienās. CR (karietes atgriešanās) ir vienkārša karietes atgriešana kreisajā malā; arābu pasaulē tā būtu pareizā rezerve. LF (line feed) palielina drukas laukumu par vienu. Kad parādījās bitkartes ekrāni un lāzerprinteri, šie termini kļuva mazāk svarīgi.

    Zvanu pārvaldība un modema vadība ir papildu lietojumprogrammas, kuras var rakstīt, izmantojot javax.comm API. Zvanu pārvaldība parasti nodrošina saskarni modema vadības AT komandu saskarnei. Gandrīz visiem modemiem ir AT komandu saskarne. Šī saskarne ir dokumentēta modema rokasgrāmatās.

    Varbūt neliels piemērs padarīs šo jēdzienu skaidru. Pieņemsim, ka mums COM1 ir modems, un mēs vēlamies izsaukt tālruņa numuru. Java numuru sastādītāju pārvaldības lietojumprogramma vaicās tālruņa numuru un izvaicās modemu. Šīs komandas veic javax.comm, kas netiek interpretēts. Piemēram, lai izsauktu numuru 918003210288, zvanītāju vadība, iespējams, nosūta "AT", cerot atgūt "OK", kam seko ATDT918003210288. Viens no svarīgākajiem zvanītājprogrammu pārvaldības un modema pārvaldības uzdevumiem ir tikt galā ar kļūdām un taimautiem.

  • GUI seriālo portu pārvaldībai. Parasti sērijveida portiem ir dialoglodziņš, kas konfigurē sērijas portus, ļaujot lietotājiem iestatīt tādus parametrus kā datu pārraides ātrums, paritāte utt. Šajā diagrammā ir attēloti objekti, kas iesaistīti datu lasīšanā un / vai rakstīšanā Java seriālajā portā.

  • Atbalsts X, Y un Z modema protokoliem. Šie protokoli nodrošina atbalsta kļūdu noteikšanu un labošanu.

Programmēšanas pamati

Pārāk bieži programmētāji ienirst tieši projektā un ekrānā interaktīvi kodē ar API, nedomājot par problēmu, kuru mēģina atrisināt. Lai izvairītos no neskaidrībām un iespējamām problēmām, pirms projekta uzsākšanas apkopojiet šādu informāciju. Atcerieties, ka programmēšanas ierīcēm parasti ir nepieciešams iepazīties ar rokasgrāmatu.

  1. Iegūstiet ierīces rokasgrāmatu un izlasiet sadaļu par RS-232 saskarni un RS-232 protokolu. Lielākajai daļai ierīču ir protokols, kas jāievēro. Šo protokolu nes javax.comm API un tas tiks piegādāts ierīcē. Ierīce atšifrēs protokolu, un jums būs jāpievērš īpaša uzmanība datu sūtīšanai turp un atpakaļ. Ja sākotnējā iestatīšana nav pareiza, tas var nozīmēt, ka jūsu programma netiks startēta, tāpēc veltiet laiku, lai pārbaudītu lietas, izmantojot vienkāršu lietojumprogrammu. Citiem vārdiem sakot, izveidojiet lietojumprogrammu, kas var vienkārši ierakstīt datus seriālajā portā un pēc tam nolasīt datus no sērijas porta, izmantojot javax.comm API.

  2. Mēģiniet iegūt dažus koda paraugus no ražotāja. Pat ja tie ir citā valodā, šie piemēri var būt diezgan noderīgi.

  3. Atrodiet un kodējiet mazāko piemēru, ko varat pārbaudīt, vai varat sazināties ar ierīci. Sērijveida ierīču gadījumā tas var būt ļoti sāpīgi - jūs nosūtāt datus uz ierīci, kas savienota ar seriālo portu, un nekas nenotiek. Tas bieži ir nepareizas līnijas kondicionēšanas rezultāts. Ierīces programmēšanas noteikums numur viens (ja vien jūs nerakstāt ierīces draiveri) ir pārliecināties, ka varat sazināties ar ierīci. Dariet to, atrodot vienkāršāko, ko varat darīt ar savu ierīci, un panākt, lai tas darbotos.

  4. Ja protokols ir ļoti sarežģīts, apsveriet iespēju iegūt kādu RS-232 līnijas analizatora programmatūru. Šī programmatūra ļauj jums apskatīt datus, kas pārvietojas starp divām ierīcēm RS-232 savienojumā, netraucējot pārraidi.

Lai veiksmīgi lietotu javax.comm API lietojumprogrammā, ir jānodrošina kāda veida saskarne ierīces protokolam, izmantojot seriālo API kā transportēšanas mehānismu. Citiem vārdiem sakot, izņemot vienkāršākās ierīces, ierīces datu formatēšanai parasti ir nepieciešams cits slānis. Protams, vienkāršākais protokols ir "vaniļa" - tas nozīmē, ka protokola nav. Jūs sūtāt un saņemat datus bez interpretācijas.

Pārskats par ierosinātajām darbībām javax.comm lietošanai

Papildus protokola nodrošināšanai šeit tiek piemērots arī TCP / IP izmantotais ISO slāņa modelis, jo mums ir elektriskais slānis, kam seko ļoti vienkāršs baitu transportēšanas slānis. Šim baitu transporta slānim virsū jūs varat ievietot savu transporta slāni. Piemēram, jūsu PPP kaudze varētu izmantot javax.comm API, lai pārsūtītu baitus uz priekšu un atpakaļ uz modemu. Javax.comm slāņa loma šajā kontekstā ir diezgan maza:

  1. Piešķiriet dažu ierīču javax.comm API vadību. Pirms ierīces lietošanas javax.comm API ir jāzina par to.

  2. Atveriet ierīci un kondicionējiet līniju. Jums var būt ierīce, kurai nepieciešams 115 kilobitu ātrums bez paritātes.

  3. Rakstiet dažus datus un / vai lasiet datus, ievērojot jebkuru protokolu, kas nepieciešams ierīcei, ar kuru sazināties. Piemēram, ja izveidojat savienojumu ar printeri, iespējams, jums būs jānosūta īpašs kods, lai sāktu printeri un / vai beigtu darbu. Dažiem PostScript printeriem ir jāpārtrauc darbs, nosūtot CTRL-D 0x03.

  4. Aizveriet ostu.

Javax.comm API reģistra inicializēšana ar seriālo interfeisu portiem

Javax.comm API var pārvaldīt tikai tos portus, par kuriem tas ir informēts. Jaunākajai API versijai nav nepieciešams inicializēt nevienu portu. Startējot, javax.comm API skenē portus konkrētajā resursdatorā un tos automātiski pievieno.

Varat inicializēt sērijas porti, kurus var izmantot javax.comm API. Ierīcēm, kas neievēro standarta nosaukšanas konvenciju, varat tās skaidri pievienot, izmantojot tālāk esošo kodu segmentu.

// Reģistrējiet ierīci CommPort ttya = new javax.comm.solaris.SolarisSerial ("ttya", "/ dev / ttya"); CommPortIdentifier.addPort (ttya, CommPortIdentifier.PORT_SERIAL); CommPort ttyb = jauns javax.comm.solaris.SolarisSerial ("ttyb", "/ dev / ttyb"); CommPortIdentifier.addPort (ttyb, CommPortIdentifier.PORT_SERIAL); 

Atvēršanas un kondicionēšanas ierīces

Šis nākamais koda paraugs parāda, kā pievienot, kondicionēt un atvērt ierīci. Sīkāka informācija par konkrētās metodes izsaukumiem ir javax.comm API lapās. Šajā piemērā ierīce XYZSerialDevice tiek iestatīta tā, lai tā būtu pieejama ar nosaukumu GenericSerialReader. Šajā līnijā savienotajai ierīcei ir 9600 bitu pārraides ātrums, 1 pieturas bits, 8 bitu raksturs (jā, tie var būt mazāki) un bez paritātes. Tā visa rezultāts ir divu plūsmu nodrošināšana - viena lasīšanai un otra rakstīšanai.

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