Programiranje

Java dobi serijsko podporo z novim paketom javax.comm

API za komunikacijo Java (imenovan tudi javax.comm) je predlagana standardna razširitev, ki avtorjem komunikacijskih aplikacij omogoča pisanje programske opreme Java, ki dostopa do komunikacijskih vrat na način, neodvisen od platforme. Ta API se lahko uporablja za pisanje programske opreme za emulacijo terminalov, faksa, bralnika pametnih kartic itd.

Razviti dobro programsko opremo običajno pomeni imeti nekaj jasno določenih vmesnikov. Diagram na visoki ravni vmesniških slojev API je prikazan na tej sliki.

V tem članku vam bomo pokazali, kako uporabljati javax.comm za komunikacijo s serijsko napravo, ki temelji na RS-232. Razpravljali bomo tudi o tem, kaj ponuja javax.comm API in kaj ne. Predstavili bomo majhen primer programa, ki vam pokaže, kako s tem API-jem komunicirate s serijskimi vrati. Na koncu članka bomo na kratko podrobno opisali, kako bo ta API javax.comm deloval z drugimi gonilniki naprav, in preučili bomo zahteve za izvajanje izvornih vrat tega API-ja za določen OS.

Za razliko od klasičnih gonilnikov, ki prihajajo z lastnimi modeli komunikacije asinhronih dogodkov, API javax.comm ponuja vmesnik v slogu dogodka, ki temelji na modelu dogodkov Java (paket java.awt.event). Recimo, da želimo vedeti, ali na vhodnem vmesniku obstajajo novi podatki. To lahko ugotovimo na dva načina - mimo glasovanje ali poslušanje. Z anketiranjem procesor redno preverja medpomnilnik in preveri, ali so v vmesniku novi podatki. Med poslušanjem procesor čaka, da se dogodek zgodi v obliki novih podatkov v vhodnem medpomnilniku. Takoj, ko v pomnilnik prispejo novi podatki, ta procesorju pošlje obvestilo ali dogodek.

Med različnimi razpoložljivimi serijskimi vmesniki sta dva najbolj priljubljena standarda RS-232C in RS-422, ki določata nivo električne napetosti in pomen različnih signalnih vodov. Nizkohitrostni serijski vmesniki podatke običajno izmerijo kot kvadratni val, pri čemer koordinacijo ure zagotavljajo bit in zagoni.

RS-232 pomeni Priporočite standard 232; C se preprosto nanaša na zadnjo revizijo standarda. Zaporedna vrata na večini računalnikov uporabljajo podskupino standarda RS-232C. Celoten standard RS-232C določa 25-pinski konektor "D", od tega je 22 zatičev. Večina teh nožic ni potrebna za običajno komunikacijo z osebnim računalnikom, večina novih osebnih računalnikov pa je opremljena z moškimi konektorji tipa D, ki imajo le 9 nožic. Za več informacij o RS-232 glejte razdelek Viri.

Opomba: Za razumevanje, kaj so v preteklosti počeli drugi vozniki, si oglejte Unix termio strani z navodili ali OpenBSD Unix, različica vira gonilnika BSD Unix. To je na voljo brezplačno na internetu. Za več informacij glejte razdelek Viri.

API javax.comm: kaj je na voljo

API javax.comm ponuja razvijalcem naslednje funkcije:

  • Popolna specifikacija API za serijska in vzporedna komunikacijska vrata. (V tem članku upoštevamo samo serijska vrata.) Brez skupnega API-ja pri vaših prizadevanjih za razvoj se bo delovna obremenitev povečala, ker boste morali nuditi podporo serijskim napravam.

  • Popoln nadzor nad vsemi serijskimi parametri kadriranja (bitni zaustavitveni bit, parnost, bit / okvir) kot tudi ročni ali samodejni nadzor vodov za nadzor pretoka. Običajno sta v RS-232 dve signalni liniji, ostale pa so namenjene krmilnim linijam. Glede na vrsto komunikacije (sinhrono ali asinhrono) se lahko število izbranih krmilnih vodov razlikuje. Ta API omogoča dostop do osnovnih nadzornih signalov.

    Kratka preusmeritev vam lahko pomaga razumeti nekaj o pariteti ter zagnati in ustaviti bit. Parnost je bila dodana RS-232, ker so komunikacijske linije lahko hrupne. Recimo, da pošljemo ASCII 0, kar je v šestnajstiški številki enako 0x30 (ali 00110000 v binarni obliki), vendar med potjo nekdo mine tako, da drži magnet, zaradi česar se eden od bitov spremeni. Kot rezultat, namesto da bi poslali 8 bitov, kot je bilo predvideno, se prvemu nizu poslanih bitov doda dodaten bit, zaradi česar je vsota poslanih bitov enakomerna ali neparna. voilà! Imate pariteto.

    Začetni in končni bit sta bila dodana serijskemu komunikacijskemu protokolu, da je sprejemnikom omogočena sinhronizacija poslanih znakov. Enobitna pariteta ne omogoča odpravljanja napak - zaznavanje samo. Rešitve te težave izvirajo iz protokolov, ki so razporejeni na vrhu serijskih API-jev. Večina zaporednih komunikacij danes uporablja blokovne protokole s kontrolnimi vsotami (matematično funkcijo, ki jo je mogoče ustvariti na sprejemniku in primerjati s poslano kontrolno vsoto), ki omogoča zaznavanje napak na večjih skupinah bitov. Ko komunicirate s svojim ponudnikom internetnih storitev prek PPP, so lahko paketi 128 bajtov na paket s kontrolno vsoto. Če se ujemajo, ste 99,999% prepričani, da so podatki v redu.

    Obstajajo primeri, ko ta shema ne deluje. Na primer pri pošiljanju kritičnih ukazov napravam, ki so zelo daleč v sončnem sistemu, naprej korekturni protokoli je lahko uporabljen. Potrebni so protokoli za nadaljnje popravljanje, ker morda ni časa za ponovni prenos, vesolje pa ima veliko elektromagnetnega šuma.

    V redu, nazaj na seznam funkcij, ki jih ponuja API javax.comm!

  • Osnovni I / O prek podrazreda tokov Java IO. Za vhod in izhod API javax.comm uporablja tokove; koncept tokov bi moral biti poznan vsem programerjem Java. Pomembno je, da pri gradnji nove funkcionalnosti znova uporabimo koncepte Jave, sicer bodo API-ji postali okorni.

  • Tokovi, ki jih je mogoče razširiti tako, da nudijo nadzor pretoka odjemalca in nadzor praga. Na primer, morda boste želeli opozorilo, če je v vmesnem pomnilniku 10 znakov ali kadar je za znake le še 10 mest. Nadzor pretoka je pomemben, kadar dve napravi, povezani prek vmesnika, ne moreta slediti druga drugi. Brez nadzora pretoka lahko imate prekoračitve ali spodkopavanja. V stanju prekoračitve ste prejeli podatke, preden so bili obdelani, zato so bili izgubljeni; v spodnjem delu ste bili pripravljeni na podatke, vendar ti niso bili na voljo. Običajno se ti pogoji pojavijo pri USART (Universal Synchronous Asynchronous Receiver Transmitter), ki je strojna oprema, ki pretvori bajte v serijsko valovno obliko s časom, ki ustreza hitrosti prenosa.

    API javax.comm uporablja model dogodka Java za obveščanje o različnih spremembah signalne linije in stanju medpomnilnika. Spremembe stanja se nanašajo na natančno definirane signale, določene v standardu RS-232. Modem na primer modem uporablja za signalizacijo, da je vzpostavil povezavo z drugim modemom, ali pa je zaznal ton nosilca. Vzpostavitev povezave ali zaznavanje tona operaterja je dogodek. Zaznavanje dogodkov in obveščanje o spremembah je izvedeno v tem API-ju.

Česar ni na voljo

API javax.comm ne zagotavlja:

  • Obdelava vrste linijske discipline, upravljanje klicatelja ali upravljanje modema. Line disciplina se nanaša na dodatno obdelavo vhodnih ali izhodnih znakov. Na primer, ena pogosta možnost naknadne obdelave je pretvorba CR v CR LF. Ti izrazi izvirajo iz zgodnjih časov teletipov. CR (carriage return) pomeni preprosto vrnitev kočije na levi rob; v arabskem svetu bi bila to prava meja. LF (vrstico podajanja) poveča območje tiskanja za eno. Ko so se pojavili bitni zasloni in laserski tiskalniki, so ti izrazi postali manj pomembni.

    Upravljanje številčnic in upravljanje modema so dodatne aplikacije, ki jih lahko zapišemo z API-jem javax.comm. Upravljanje številčnic običajno ponuja vmesnik za ukazni vmesnik upravljanja modema. Skoraj vsi modemi imajo ukazni vmesnik AT. Ta vmesnik je dokumentiran v modemskih priročnikih.

    Morda bo majhen primer razjasnil ta koncept. Recimo, da imamo modem na COM1 in želimo poklicati telefonsko številko. Aplikacija za upravljanje klicalnika Java bo zahtevala telefonsko številko in zaslišala modem. Te ukaze prenaša javax.comm, ki ne razlaga. Če želite na primer poklicati številko 918003210288, vodstvo klicatelja verjetno pošlje "AT" v upanju, da bo dobilo nazaj "OK", čemur sledi ATDT918003210288. Ena najpomembnejših nalog upravljanja klicanja in upravljanja modema je reševanje napak in časovnih omejitev.

  • GUI za upravljanje serijskih vrat. Običajno imajo serijska vrata pogovorno okno, ki konfigurira serijska vrata, kar uporabnikom omogoča nastavitev parametrov, kot so hitrost prenosa podatkov, parnost itd. Naslednji diagram prikazuje predmete, ki sodelujejo pri branju in / ali zapisovanju podatkov v serijska vrata z Jave.

  • Podpora za protokole X, Y in Z modema. Ti protokoli zagotavljajo podporo pri odkrivanju in popravljanju napak.

Osnove programiranja

Programerji se prepogosto potopijo naravnost v projekt in interaktivno kodirajo z API-jem na zaslonu, ne da bi sploh pomislili na težavo, ki jo skušajo rešiti. Da se izognete zmedi in morebitnim težavam, pred začetkom projekta zberite naslednje informacije. Ne pozabite, da programiranje naprav običajno zahteva, da se obrnete na priročnik.

  1. Pridobite priročnik za napravo in preberite razdelek o vmesniku RS-232 in protokolu RS-232. Večina naprav ima protokol, ki ga je treba upoštevati. Ta protokol bo prenašal API javax.comm in ga poslal v napravo. Naprava bo dešifrirala protokol in morali boste biti zelo pozorni na pošiljanje podatkov naprej in nazaj. Če ne dobite pravilne začetne nastavitve, lahko pomeni, da se vaša aplikacija ne zažene, zato si vzemite čas in preizkusite stvari s preprosto aplikacijo. Z drugimi besedami, ustvarite aplikacijo, ki lahko preprosto zapiše podatke na serijska vrata in nato z API-ja javax.comm prebere podatke iz serijskih vrat.

  2. Poskusite dobiti nekaj vzorcev kode od proizvajalca. Tudi če so v drugem jeziku, so ti primeri lahko zelo koristni.

  3. Poiščite in kodirajte najmanjši primer, s katerim lahko preverite, ali lahko komunicirate z napravo. Pri serijskih napravah je to lahko zelo boleče - podatke pošljete v napravo, priključeno na serijska vrata, in nič se ne zgodi. To je pogosto posledica nepravilnega kondicioniranja proge. Pravilo številka ena pri programiranju naprave (razen če pišete gonilnik naprave) je zagotoviti komunikacijo z napravo. Naredite to tako, da poiščete najpreprostejšo stvar, ki jo lahko naredite s svojo napravo, in poskrbite, da bo to delovalo.

  4. Če je protokol zelo zapleten, razmislite o programski opremi za linijski analizator RS-232. Ta programska oprema vam omogoča, da si ogledate podatke, ki se premikajo med obema napravama na povezavi RS-232, ne da bi pri tem ovirali prenos.

Za uspešno uporabo API-ja javax.comm v aplikaciji morate v protokol naprave vnesti nekakšen vmesnik z uporabo serijskega API-ja kot transportnega mehanizma. Z drugimi besedami, z izjemo najpreprostejših naprav je za formatiranje podatkov za napravo običajno potreben še en sloj. Seveda je najpreprostejši protokol "vanilija" - kar pomeni, da protokola ni. Podatke pošiljate in prejemate brez interpretacije.

Pregled predlaganih korakov za uporabo javax.comm

Poleg zagotavljanja protokola tudi tu velja model nanosa ISO, ki se uporablja za TCP / IP, saj imamo električno plast, ki ji sledi zelo preprost bajtni transportni sloj. Na to bajtno transportno plast lahko postavite svoj transportni sloj. Na primer, vaš sklad PPP lahko uporablja API javax.comm za prenos bajtov naprej in nazaj na modem. Vloga sloja javax.comm je v tem kontekstu precej majhna:

  1. Dajte nadzor nad nekaterimi napravami API javax.comm. Preden uporabite napravo, mora API javax.comm vedeti o njej.

  2. Odprite napravo in pripravite linijo. Morda imate napravo, ki zahteva hitrost prenosa 115 kilobitov brez paritete.

  3. Napišite nekaj podatkov in / ali preberite podatke, ne glede na protokol, ki ga zahteva naprava, s katero komunicirate. Če se na primer povežete s tiskalnikom, boste morda morali poslati posebno kodo za zagon tiskalnika in / ali končanje opravila. Nekateri tiskalniki PostScript zahtevajo, da opravilo končate s pošiljanjem CTRL-D 0x03.

  4. Zaprite vrata.

Inicializacija registra javax.comm API z vrati serijskih vmesnikov

API javax.comm lahko upravlja samo vrata, ki jih pozna. Najnovejša različica API-ja ne zahteva inicializacije nobenih vrat. Ob zagonu API javax.comm išče vrata na določenem gostitelju in jih samodejno doda.

Inicializirate lahko serijska vrata, ki jih lahko uporablja vaš API javax.comm. Za naprave, ki ne upoštevajo standardne konvencije o poimenovanju, jih lahko izrecno dodate s spodnjim segmentom kode.

// Registriraj napravo CommPort ttya = new javax.comm.solaris.SolarisSerial ("ttya", "/ dev / ttya"); CommPortIdentifier.addPort (ttya, CommPortIdentifier.PORT_SERIAL); CommPort ttyb = nov javax.comm.solaris.SolarisSerial ("ttyb", "/ dev / ttyb"); CommPortIdentifier.addPort (ttyb, CommPortIdentifier.PORT_SERIAL); 

Naprave za odpiranje in kondicioniranje

Naslednji vzorec kode prikazuje, kako dodati, pripraviti in odpreti napravo. Podrobnosti o posebnih klicih metod so na straneh API za javax.comm. Ta primer nastavi, da je naprava z imenom XYZSerialDevice dostopna z imenom GenericSerialReader. Naprava, priključena na tej liniji, ima hitrost prenosa 9600, 1 stop bit, znak 8 bitov (da, lahko so manjši) in brez paritete. Rezultat vsega tega je zagotoviti dva toka - enega za branje in drugega za pisanje.

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