Programmering

Java får seriel support med den nye javax.comm-pakke

Java Communications (alias javax.comm) API er en foreslået standardudvidelse, der gør det muligt for forfattere af kommunikationsapplikationer at skrive Java-software, der får adgang til kommunikationsporte på en platformuafhængig måde. Denne API kan bruges til at skrive terminalemuleringssoftware, faxsoftware, softwarelæsersoftware osv.

At udvikle god software betyder normalt at have nogle klart definerede grænseflader. Diagrammet på højt niveau af API-interface lagene er vist i denne figur.

I denne artikel viser vi dig, hvordan du bruger javax.comm til at kommunikere med en seriel enhed baseret på RS-232. Vi diskuterer også, hvad javax.comm API giver, og hvad det ikke giver. Vi præsenterer et lille eksempelprogram, der viser dig, hvordan du kommunikerer til den serielle port ved hjælp af denne API. I slutningen af ​​artiklen detaljerer vi kort hvordan denne javax.comm API fungerer med andre enhedsdrivere, og vi gennemgår kravene til at udføre en indbygget port i denne API til et specifikt OS.

I modsætning til klassiske drivere, der kommer med deres egne modeller for kommunikation af asynkrone begivenheder, giver javax.comm API en begivenhedsstil-interface baseret på Java-hændelsesmodellen (java.awt.event-pakke). Lad os sige, at vi vil vide, om der sidder nye data på inputbufferen. Vi kan finde ud af det på to måder - af afstemning eller hører efter. Ved afstemning kontrollerer processoren med jævne mellemrum bufferen for at se, om der er nye data i bufferen. Ved lytning venter processoren på, at en begivenhed skal forekomme i form af nye data i inputbufferen. Så snart nye data ankommer i bufferen, sender de en underretning eller begivenhed til processoren.

Blandt de forskellige tilgængelige serielle grænseflader er to af de mest populære RS-232C og RS-422 standarder, der definerer de elektriske signalniveauer og betydningen af ​​forskellige signallinjer. Seriøse grænseflader med lav hastighed viser typisk data ud som en firkantbølge med urkoordinering leveret af start- og stopbits.

RS-232 står for Anbefal standard 232; det C refererer simpelthen til den seneste revision af standarden. De serielle porte på de fleste computere bruger et undersæt af RS-232C-standarden. Den fulde RS-232C-standard specificerer et 25-polet "D" -stik, hvoraf 22 ben bruges. De fleste af disse ben er ikke nødvendige til normal pc-kommunikation, og de fleste nye pc'er er faktisk udstyret med mandlige D-type stik, der kun har 9 ben. For mere om RS-232, se afsnittet Ressourcer.

Bemærk: For at forstå, hvad andre drivere har gjort tidligere, skal du kigge på Unix termio manuel side eller OpenBSD Unix, en variation af BSD Unix-driverkilden. Dette er tilgængeligt gratis på Internettet. Se afsnittet Ressourcer for mere information.

API'en javax.comm: Hvad leveres

API'en javax.comm giver udviklerne følgende funktionalitet:

  • En komplet API-specifikation til serielle og parallelle kommunikationsporte. (I denne artikel overvejer vi kun serielle porte.) Uden en fælles API i din udviklingsindsats vil arbejdsbyrden stige, fordi du bliver nødt til at yde support til serielle enheder.

  • Fuld kontrol af alle serielle indramningsparametre (baud stopbits, paritet, bits / frame) samt manuel eller automatisk kontrol af flowkontrollinjerne. Normalt er der i RS-232 to signallinjer, og resten er beregnet til styrelinjer. Afhængigt af kommunikationstypen (synkron eller asynkron) kan antallet af valgte linier variere. Denne API giver adgang til de underliggende styresignaler.

    En kort omdirigering her kan hjælpe dig med at forstå noget om paritet og starte og stoppe bits. Paritet blev tilføjet til RS-232, fordi kommunikationslinjer kan være støjende. Lad os sige, at vi sender ASCII 0, som i hex er lig med 0x30 (eller 00110000 i binær), men undervejs passerer nogen ved at holde en magnet, hvilket får en af ​​bitene til at ændre sig. Som et resultat, i stedet for at sende 8 bits som tilsigtet, tilføjes en ekstra bit til den første streng af sendte bits, hvilket gør summen af ​​de sendte bit lige eller ulige. voilà! Du har paritet.

    Start- og stopbits blev føjet til den serielle kommunikationsprotokol for at give modtagerne mulighed for at synkronisere på de tegn, der sendes. En-bit paritet tillader ikke fejlkorrektion - kun detektion. Løsninger på dette problem kommer fra protokoller, der er lagdelt oven på de serielle API'er. De fleste serielle kommunikationer i disse dage bruger blokprotokoller med kontrolsummer (en matematisk funktion, der kan genereres på modtageren og sammenlignes med den transmitterede kontrolsum), der gør det muligt at detektere fejl på større grupper af bits. Når du kommunikerer med din internetudbyder via PPP, kan pakker være 128 byte pr. Pakke med et kontrolsum. Hvis de matcher, er du 99,999% sikker på, at dataene er okay.

    Der er tilfælde, hvor denne ordning ikke fungerer. For eksempel når du sender kritiske kommandoer til enheder, der er meget langt ude i solsystemet, videresend korrektionsprotokoller Kan bruges. Fremadrettende protokoller er nødvendige, fordi der muligvis ikke er tid til en retransmission, og rummet har meget elektromagnetisk støj.

    Okay, tilbage til listen over funktionaliteter leveret af javax.comm API!

  • Den grundlæggende I / O via en underklasse af Java IO-streams. Til input og output bruger javax.comm API streams; begrebet streams skal være kendt for alle Java-programmører. Det er vigtigt at genbruge Java-koncepter, når der oprettes ny funktionalitet, ellers bliver API'erne uhåndterlige.

  • Streams, der kan udvides til at give klientflowkontrol og tærskelstyring. For eksempel vil du muligvis have en advarsel, når der er 10 tegn i bufferen, eller når der kun er 10 placeringer tilbage til tegn. Flowkontrol er vigtig, når de to enheder, der er forbundet via en grænseflade, ikke kan følge med hinanden. Uden flowkontrol kan du have overskridelser eller underkørsel. I tilstanden overskridelse modtog du data, før de blev behandlet, så de gik tabt; i underkørslen var du klar til data, men den var ikke tilgængelig. Normalt forekommer disse forhold ved USART (Universal Synchronous Asynchronous Receiver Transmitter), som er hardware, der konverterer bytes til en seriel bølgeform med timing til at matche baudhastigheden.

    APIet javax.comm bruger Java-hændelsesmodellen til at give besked om forskellige signallinjeændringer såvel som bufferstatus. Tilstandsændringer henviser til veldefinerede signaler specificeret i RS-232-standarden. For eksempel anvendes carrier detect af et modem til at signalere, at det har oprettet forbindelse til et andet modem, eller det har detekteret en carrier tone. Det er en begivenhed at oprette forbindelse eller detektere en bærertone. Begivenhedsdetektering og underretning om ændringer er implementeret i denne API.

Hvad der ikke leveres

API'en javax.comm indeholder ikke:

  • Linjedisciplinetype behandling, dialer management eller modem management. Liniedisciplin henviser til yderligere behandling af input eller output tegn. For eksempel er en almindelig efterbehandlingsmulighed konvertering af CR til CR LF. Disse udtryk har deres oprindelse i de tidlige dage af teletyper. CR (vognretur) betyder at returnere vognen til venstre margen; i den arabiske verden ville dette være den rigtige margen. LF (linjetilførsel) fremrykker udskrivningsområdet en op. Da bitmapskærme og laserprintere kom sammen, blev disse vilkår mindre vigtige.

    Dialer management og modemstyring er yderligere applikationer, der kan skrives ved hjælp af javax.comm API. Dialer management giver typisk en grænseflade til modemadministrationens AT-kommandogrænseflade. Næsten alle modemer har en AT-kommandogrænseflade. Denne grænseflade er dokumenteret i modemmanualer.

    Måske vil et lille eksempel gøre dette koncept klart. Antag, at vi har et modem på COM1, og vi vil ringe et telefonnummer. Et Java-opkaldshåndteringsprogram søger efter telefonnummeret og forhører modemet. Disse kommandoer bæres af javax.comm, hvilket ikke fortolker. For at ringe op til nummeret 918003210288 sender for eksempel dialerledelsen sandsynligvis et "AT" i håb om at få et "OK" tilbage efterfulgt af ATDT918003210288. En af de vigtigste opgaver for dialer management og modem management er at håndtere fejl og timeouts.

  • GUI til styring af seriel port. Normalt har serielle porte en dialogboks, der konfigurerer de serielle porte, så brugerne kan indstille parametre som baudrate, paritet osv. Følgende diagram viser de objekter, der er involveret i læsning og / eller skrivning af data til en seriel port fra Java.

  • Understøttelse af X-, Y- og Z-modemprotokoller. Disse protokoller giver detektion og korrektion af supportfejl.

Programmeringsgrundlaget

Alt for ofte dykker programmører direkte ind i et projekt og koder interaktivt med en API på skærmen uden at tænke over det problem, de prøver at løse. For at undgå forvirring og potentielle problemer skal du samle følgende oplysninger, inden du starter et projekt. Husk, at programmeringsenheder normalt kræver, at du konsulterer en manual.

  1. Få manualen til enheden, og læs afsnittet om RS-232-interface og RS-232-protokol. De fleste enheder har en protokol, der skal følges. Denne protokol bæres af javax.comm API og leveres til enheden. Enheden afkoder protokollen, og du skal være meget opmærksom på at sende data frem og tilbage. Hvis du ikke får den oprindelige opsætning korrekt, kan det betyde, at din applikation ikke starter, så tag dig tid til at teste tingene med en simpel applikation. Med andre ord, opret et program, der simpelthen kan skrive data til den serielle port og derefter læse data fra den serielle port ved hjælp af javax.comm API.

  2. Prøv at få nogle kodeeksempler fra producenten. Selvom de er på et andet sprog, kan disse eksempler være ret nyttige.

  3. Find og kode det mindste eksempel, du kan, for at bekræfte, at du kan kommunikere med enheden. I tilfælde af serielle enheder kan dette være meget smertefuldt - du sender data til en enhed, der er tilsluttet den serielle port, og der sker intet. Dette er ofte resultatet af forkert konditionering af linjen. Den førende regel for enhedsprogrammering (medmindre du skriver en enhedsdriver) er at sikre, at du kan kommunikere med enheden. Gør dette ved at finde den enkleste ting, du kan gøre med din enhed og få det til at fungere.

  4. Hvis protokollen er meget kompliceret, kan du overveje at få noget RS-232-analysesoftware. Denne software giver dig mulighed for at se på dataene, der bevæger sig mellem de to enheder på RS-232-forbindelsen uden at forstyrre transmissionen.

Brug af javax.comm API med succes i en applikation kræver, at du angiver en eller anden type interface til enhedsprotokollen ved hjælp af den serielle API som transportmekanisme. Med andre ord, med undtagelse af de enkleste enheder, er der normalt et andet lag, der kræves for at formatere dataene til enheden. Naturligvis er den enkleste protokol "vanille" - hvilket betyder at der ikke er nogen protokol. Du sender og modtager data uden fortolkning.

Oversigt over foreslåede trin til brug af javax.comm

Ud over at give en protokol gælder ISO-lagdelingsmodellen, der bruges til TCP / IP, også her, da vi har et elektrisk lag efterfulgt af et meget simpelt byte-transportlag. Oven på dette byte-transportlag kan du placere dit transportlag. For eksempel kan din PPP-stak bruge javax.comm API til at overføre bytes frem og tilbage til modemet. Rollen for javax.comm-laget er ret lille, når man ser på det i denne sammenhæng:

  1. Giv javax.comm API kontrol over nogle af enhederne. Inden du bruger en enhed, skal javax.comm API vide om det.

  2. Åbn enheden og tilstand linjen. Du har muligvis en enhed, der kræver en baudrate på 115 kilobit uden paritet.

  3. Skriv nogle data og / eller læs data efter hvilken protokol den enhed, du kommunikerer med, kræver. Hvis du f.eks. Opretter forbindelse til en printer, skal du muligvis sende en særlig kode for at starte printeren og / eller afslutte jobbet. Nogle PostScript-printere kræver, at du afslutter jobbet ved at sende CTRL-D 0x03.

  4. Luk porten.

Initialisering af javax.comm API-registreringsdatabasen med serielle interface-porte

API'en javax.comm kan kun administrere porte, som den er opmærksom på. Den seneste version af API'en kræver ikke, at nogen porte initialiseres. Ved opstart scanner javax.comm API efter porte på den bestemte vært og tilføjer dem automatisk.

Du kan initialisere de serielle porte, som din javax.comm API kan bruge. For enheder, der ikke følger standardnavngivningskonventionen, kan du tilføje dem eksplicit ved hjælp af kodesegmentet nedenfor.

// Registrer enheden CommPort ttya = new javax.comm.solaris.SolarisSerial ("ttya", "/ dev / ttya"); CommPortIdentifier.addPort (ttya, CommPortIdentifier.PORT_SERIAL); CommPort ttyb = ny javax.comm.solaris.SolarisSerial ("ttyb", "/ dev / ttyb"); CommPortIdentifier.addPort (ttyb, CommPortIdentifier.PORT_SERIAL); 

Åbnings- og konditioneringsudstyr

Denne næste kodeeksempel demonstrerer, hvordan du tilføjer, konditionerer og åbner en enhed. Detaljer om de specifikke metodeopkald findes på API-siderne til javax.comm. Dette eksempel indstiller enheden kaldet XYZSerialDevice til at være tilgængelig med navn GenericSerialReader. Enheden tilsluttet på denne linje har en baudhastighed på 9600, 1 stopbit, et tegn på 8 bit (ja, de kan være mindre) og ingen paritet. Resultatet af alt dette er at give to streams - en til læsning og en anden til at skrive.