Java dobiva serijsku podršku s novim paketom javax.comm

API Java Communications (aka javax.comm) predloženo je standardno proširenje koje autorima komunikacijskih aplikacija omogućuje pisanje Java softvera koji pristupa komunikacijskim priključcima na način neovisan o platformi. Ovaj se API može koristiti za pisanje softvera za emulaciju terminala, softvera za faks, softvera za čitanje pametnih kartica itd.

Razviti dobar softver obično znači imati neko jasno definirano sučelje. Dijagram visoke razine slojeva API sučelja prikazan je na ovoj slici.

U ovom ćemo vam članku pokazati kako koristiti javax.comm za komunikaciju sa serijskim uređajem koji se temelji na RS-232. Također ćemo razgovarati o tome što nudi javax.comm API, a što ne. Predstavit ćemo mali primjer programa koji vam pokazuje kako komunicirati sa serijskim priključkom pomoću ovog API-ja. Na kraju članka ukratko ćemo objasniti kako će ovaj javax.comm API raditi s drugim upravljačkim programima i preći ćemo na zahtjeve za izvođenje izvornog priključka ovog API-ja na određeni OS.

Za razliku od klasičnih upravljačkih programa koji dolaze s vlastitim modelima komunikacije asinkronih događaja, API javax.comm pruža sučelje u stilu događaja temeljeno na Java modelu događaja (paket java.awt.event). Recimo da želimo znati postoje li novi podaci na ulaznom međuspremniku. To možemo saznati na dva načina - anketiranjem ili slušanjem . S anketiranjem, procesor povremeno provjerava međuspremnik kako bi utvrdio ima li novih podataka u međuspremniku. Uz preslušavanje, procesor čeka da se dogodi događaj u obliku novih podataka u ulaznom međuspremniku. Čim novi podaci stignu u međuspremnik, procesoru šalje obavijest ili događaj.

Među različitim dostupnim serijskim sučeljima, dva najpopularnija su RS-232C i RS-422 standardi, koji definiraju razinu električnog signala i značenje različitih signalnih vodova. Serijska sučelja male brzine obično izbacuju podatke u obliku kvadratnog vala, a koordinaciju takta pružaju bit i start i stop.

RS-232 označava Preporučeni standard 232 ; C se jednostavno odnosi na najnoviju reviziju standarda. Serijski priključci na većini računala koriste podskup standarda RS-232C. Puni RS-232C standard određuje 25-pinski "D" konektor, od čega se koristi 22 pina. Većina ovih pinova nije potrebna za normalnu PC komunikaciju, a doista, većina novih računala opremljena je muškim konektorima D tipa koji imaju samo 9 pinova. Za više informacija o RS-232, pogledajte odjeljak Resursi.

Napomena: Da biste razumjeli što su drugi pokretači radili u prošlosti, pogledajte termiostranicu s priručnikom za Unix ili OpenBSD Unix, varijaciju izvora BSD Unix upravljačkih programa. To je besplatno dostupno na Internetu. Za više informacija pogledajte odjeljak Resursi.

API javax.comm: Što se nudi

API javax.comm pruža sljedeću funkcionalnost programerima:

  • Kompletna API specifikacija za serijske i paralelne komunikacijske priključke. (U ovom članku razmatramo samo serijske priključke.) Bez zajedničkog API-ja u vašim razvojnim naporima, radno opterećenje će se povećati jer ćete morati pružiti podršku serijskim uređajima.

  • Potpuna kontrola svih parametara serijskog kadriranja (bitovi za zaustavljanje, paritet, bitovi / okvir), kao i ručna ili automatska kontrola vodova protoka. Uobičajeno, u RS-232 postoje dvije signalne linije, a ostale su namijenjene upravljačkim vodovima. Ovisno o vrsti komunikacije (sinkronoj ili asinkronoj), broj odabranih upravljačkih linija može varirati. Ovaj API omogućuje pristup temeljnim kontrolnim signalima.

    Kratka skretanja ovdje vam mogu pomoći da razumijete nešto o paritetu i započnete i zaustavite bitove. Paritet je dodan RS-232 jer komunikacijske linije mogu biti bučne. Recimo da pošaljemo ASCII 0 , što je u hex-u jednako 0x30 (ili 00110000 u binarnom obliku), ali usput netko prolazi držeći magnet, uzrokujući promjenu jednog od bitova. Kao rezultat toga, umjesto da se pošalje 8 bitova kako je predviđeno, dodatni bit dodaje se prvom nizu poslanih bitova, što čini zbroj poslanih bitova parnim ili neparnim. voilà ! Imate paritet.

    Bitovi za pokretanje i zaustavljanje dodani su u protokol serijske komunikacije kako bi se prijamnicima omogućila sinkronizacija znakova koji se šalju. Jednobitni paritet ne dopušta ispravljanje pogrešaka - samo otkrivanje. Rješenja za ovaj problem dolaze iz protokola koji su slojevi na vrhu serijskih API-ja. Većina serijske komunikacije danas koristi blokovske protokole s kontrolnim zbrojevima (matematička funkcija koja se može generirati na prijamniku i usporediti s prenesenom kontrolnom sumom) koji omogućuju otkrivanje pogrešaka na većim skupinama bitova. Kada s ISP-om komunicirate putem PPP-a, paketi mogu imati 128 bajta po paketu s kontrolnom sumom. Ako se podudaraju, vi ste 99,999% sigurni da su podaci u redu.

    Postoje slučajevi u kojima ova shema ne funkcionira. Na primjer, kad se kritične naredbe šalju uređajima koji su vrlo daleko u Sunčevom sustavu, mogu se koristiti protokoli za ispravljanje naprijed . Potrebni su protokoli za ispravljanje naprijed jer možda neće biti vremena za ponovni prijenos, a svemir ima puno elektromagnetskih šuma.

    Dobro, vratimo se na popis funkcionalnosti koje pruža API javax.comm!

  • Osnovni I / O putem podrazreda Java IO tokova. Za ulaz i izlaz API javax.comm koristi streamove; koncept tokova trebao bi biti poznat svim Java programerima. Važno je ponovno koristiti koncepte Jave pri izgradnji nove funkcionalnosti jer će API-i postati nezgrapni.

  • Potoci koji se mogu proširiti kako bi se osigurala kontrola protoka klijenta i kontrole praga. Na primjer, možda ćete trebati upozorenje kad u međuspremniku ima 10 znakova ili kada za znakove ostane samo 10 mjesta. Kontrola protoka je važna kada dva uređaja povezana preko sučelja ne mogu pratiti jedan drugoga. Bez kontrole protoka, možete imati prekoračenje ili ispod . U prekoračenju ste dobili podatke prije nego što su obrađeni pa su izgubljeni; u underrunu ste bili spremni za podatke, ali oni nisu bili dostupni. Obično se ti uvjeti javljaju na USART-u (Universal Synchronous Asynchronous Receiver Transmitter), koji je hardver koji pretvara bajtove u serijski valni oblik s vremenom kako bi odgovarao brzini prijenosa.

    API javax.comm koristi model događaja Java za pružanje obavijesti o raznim promjenama signalne linije, kao i statusu međuspremnika. Promjene stanja odnose se na dobro definirane signale specificirane u RS-232 standardu. Na primjer, modem koristi otkrivanje nosača da signalizira da je uspostavio vezu s drugim modemom ili je otkrio ton nositelja. Uspostavljanje veze ili otkrivanje tona nosača događaj je. Otkrivanje događaja i obavijest o promjenama implementirani su u ovaj API.

Ono što nije predviđeno

API javax.comm ne pruža:

  • Obrada vrste linijske discipline, upravljanje brojčanikom ili upravljanje modemom. Redna disciplina odnosi se na dodatnu obradu ulaznih ili izlaznih znakova. Na primjer, jedna od uobičajenih opcija naknadne obrade je konverzija CR u CR LF. Ovi pojmovi potječu iz ranih dana teletipova. CR (povratak kočije) znači jednostavno vraćanje kočije na lijevu marginu; u arapskom svijetu to bi bila prava margina. LF (linijski unos) povećava područje ispisa za jedan. Kad su se pojavili bitmap zasloni i laserski pisači, ti su pojmovi postali manje važni.

    Birač upravljanje i upravljanje modemom su dodatne aplikacije koje se može zapisati pomoću javax.comm API. Upravljanje brojčanikom obično pruža sučelje za AT naredbeno sučelje upravljanja modema. Gotovo svi modemi imaju AT naredbeno sučelje. Ovo sučelje dokumentirano je u modemskim priručnicima.

    Možda će mali primjer ovaj koncept razjasniti. Pretpostavimo da imamo modem na COM1 i želimo nazvati telefonski broj. Aplikacija za upravljanje biranjem Java tražit će telefonski broj i ispitivati ​​modem. Te naredbe prenosi javax.comm, koji ne tumači. Primjerice, za biranje broja 918003210288 uprava brojčanika vjerojatno šalje "AT", nadajući se da će dobiti natrag "OK", nakon čega slijedi ATDT918003210288. Jedan od najvažnijih zadataka upravljanja biranjem brojeva i upravljanja modemom je rješavanje pogrešaka i vremenskih ograničenja.

  • GUI za upravljanje serijskim priključkom. Obično serijski portovi imaju dijaloški okvir koji konfigurira serijske portove, omogućujući korisnicima postavljanje parametara kao što su brzina prijenosa, paritet i tako dalje. Sljedeći dijagram prikazuje objekte koji sudjeluju u čitanju i / ili upisivanju podataka u serijski priključak s Jave.

  • Podrška za protokole X, Y i Z modema. Ovi protokoli pružaju podršku za otkrivanje i ispravljanje pogrešaka.

Osnove programiranja

Programeri prečesto zaranjaju ravno u projekt i interaktivno kodiraju s API-jem na zaslonu, a da uopće ne razmišljaju o problemu koji pokušavaju riješiti. Da biste izbjegli zabunu i potencijalne probleme, prije početka projekta prikupite sljedeće podatke. Zapamtite, za programiranje uređaja obično je potrebno potražiti priručnik.

  1. Get the manual for the device and read the section on the RS-232 interface and RS-232 protocol. Most devices have a protocol that must be followed. This protocol will be carried by the javax.comm API and delivered to the device. The device will decode the protocol, and you will have to pay close attention to sending data back and forth. Not getting the initial set-up correct can mean your application won't start, so take the time to test things out with a simple application. In other words, create an application that can simply write data onto the serial port and then read data from the serial port using the javax.comm API.

  2. Try to get some code samples from the manufacturer. Even if they are in another language, these examples can be quite useful.

  3. Find and code the smallest example you can to verify that you can communicate with the device. In the case of serial devices, this can be very painful -- you send data to a device connected to the serial port and nothing happens. This is often the result of incorrect conditioning of the line. The number one rule of device programming (unless you are writing a device driver) is to make sure you can communicate with the device. Do this by finding the simplest thing you can do with your device and getting that to work.

  4. If the protocol is very complicated, consider getting some RS-232 line analyzer software. This software allows you to look at the data moving between the two devices on the RS-232 connection without interfering with the transmission.

Using the javax.comm API successfully in an application requires you to provide some type of interface to the device protocol using the serial API as the transport mechanism. In other words, with the exception of the simplest devices, there is usually another layer required to format the data for the device. Of course the simplest protocol is "vanilla" -- meaning there is no protocol. You send and receive data with no interpretation.

Overview of suggested steps for using javax.comm

In addition to providing a protocol, the ISO layering model used for TCP/IP also applies here in that we have an electrical layer, followed by a very simple byte transport layer. On top of this byte transport layer you could put your transport layer. For example, your PPP stack could use the javax.comm API to transfer bytes back and forth to the modem. The role of the javax.comm layer is quite small when looked at in this context:

  1. Give the javax.comm API control of some of the devices. Before you use a device, the javax.comm API has to know about it.

  2. Open the device and condition the line. You may have a device that requires a baud rate of 115 kilobits with no parity.

  3. Write some data and/or read data following whatever protocol the device you are communicating with requires. For example, if you connect to a printer, you may have to send a special code to start the printer and/or end the job. Some PostScript printers require you to end the job by sending CTRL-D 0x03.

  4. Close the port.

Initializing the javax.comm API registry with serial interface ports

The javax.comm API can only manage ports that it is aware of. The latest version of the API does not require any ports to be initialized. On start-up, the javax.comm API scans for ports on the particular host and adds them automatically.

You can initialize the serial ports your javax.comm API can use. For devices that do not follow the standard naming convention, you can add them explicitly using the code segment below.

// Register the device CommPort ttya = new javax.comm.solaris.SolarisSerial("ttya","/dev/ttya"); CommPortIdentifier.addPort(ttya,CommPortIdentifier.PORT_SERIAL); CommPort ttyb = new javax.comm.solaris.SolarisSerial("ttyb","/dev/ttyb"); CommPortIdentifier.addPort(ttyb,CommPortIdentifier.PORT_SERIAL); 

Opening and conditioning devices

This next code sample demonstrates how to add, condition, and open a device. Details on the specific method calls are in the API pages for javax.comm. This example sets the device called XYZSerialDevice to be accessible with name GenericSerialReader. The device connected on this line has a baud rate of 9600, 1 stop bit, a character of 8 bits (yes, they can be smaller), and no parity. The result of all of this is to provide two streams -- one for reading and another for writing.