Programmering

Java får seriell støtte med den nye javax.comm-pakken

Java Communications (alias javax.comm) API er en foreslått standardutvidelse som gjør det mulig for forfattere av kommunikasjonsapplikasjoner å skrive Java-programvare som får tilgang til kommunikasjonsporter på en plattformuavhengig måte. Denne API-en kan brukes til å skrive programvare for terminalemulering, faksprogramvare, programvare for smartkortleser og så videre.

Å utvikle god programvare betyr vanligvis å ha noen klart definerte grensesnitt. Høynivådiagrammet over API-grensesnittlagene er vist i denne figuren.

I denne artikkelen vil vi vise deg hvordan du bruker javax.comm til å kommunisere med en seriell enhet basert på RS-232. Vi vil også diskutere hva javax.comm API gir og hva det ikke gir. Vi presenterer et lite eksempelprogram som viser deg hvordan du kommuniserer til den serielle porten ved hjelp av dette API-et. På slutten av artikkelen vil vi kort detaljere hvordan denne javax.comm API vil fungere med andre enhetsdrivere, og vi vil gå gjennom kravene for å utføre en egen port av denne APIen til et bestemt operativsystem.

I motsetning til klassiske drivere, som kommer med sine egne modeller for kommunikasjon av asynkrone hendelser, gir javax.comm API et hendelsesgrensesnitt basert på Java-hendelsesmodellen (java.awt.event-pakke). La oss si at vi vil vite om det er noen nye data som sitter på inngangsbufferen. Vi kan finne det ut på to måter - av avstemning eller lytter. Ved avstemning sjekker prosessoren bufferen med jevne mellomrom for å se om det er nye data i bufferen. Ved lytting venter prosessoren på at en hendelse skal skje i form av nye data i inngangsbufferen. Så snart nye data kommer i bufferen, sender den et varsel eller en hendelse til prosessoren.

Blant de forskjellige serielle grensesnittene som er tilgjengelige, er to av de mest populære standardene RS-232C og RS-422, som definerer de elektriske signalnivåene og betydningen av forskjellige signallinjer. Lavhastighets serielle grensesnitt klokker vanligvis data som en firkantbølge, med klokkoordinering gitt av start- og stoppbiter.

RS-232 står for Anbefal standard 232; de C refererer ganske enkelt til den siste revisjonen av standarden. Serielle porter på de fleste datamaskiner bruker et delsett av RS-232C-standarden. Hele RS-232C-standarden spesifiserer en 25-pinners "D" -kontakt, hvorav 22 pinner brukes. De fleste av disse pinnene er ikke nødvendig for normal PC-kommunikasjon, og de fleste nye PC-er er faktisk utstyrt med mannlige D-type kontakter som bare har 9 pinner. For mer informasjon om RS-232, se Ressurser-delen.

Merk: For å forstå hva andre drivere har gjort tidligere, ta en titt på Unix termio manuell side eller OpenBSD Unix, en variant av BSD Unix-driverkilden. Dette er tilgjengelig gratis på Internett. Se avsnittet Ressurser for mer informasjon.

API-en for javax.comm: Hva er gitt?

APIet javax.comm gir utviklerne følgende funksjonalitet:

  • En komplett API-spesifikasjon for serielle og parallelle kommunikasjonsporter. (I denne artikkelen vurderer vi bare serielle porter.) Uten en felles API i utviklingsarbeidet vil arbeidsmengden øke fordi du må gi støtte til serielle enheter.

  • Full kontroll over alle serielle innrammingsparametere (baudstoppbiter, paritet, bits / ramme) samt manuell eller automatisk kontroll av strømningskontrolllinjene. Normalt er det i RS-232 to signallinjer, og resten er ment for kontrollinjer. Avhengig av kommunikasjonstype (synkron eller asynkron), kan antall valgte kontrollinjer variere. Denne API-en gir tilgang til de underliggende kontrollsignalene.

    En kort avledning her kan hjelpe deg med å forstå noe om paritet og start og stopp. Paritet ble lagt til RS-232 fordi kommunikasjonslinjer kan være støyende. La oss si at vi sender ASCII 0, som i heks er lik 0x30 (eller 00110000 i binær), men underveis passerer noen ved å holde en magnet, noe som får en av bitene til å endre seg. Som et resultat, i stedet for å sende 8 bits som tiltenkt, legges det til en ekstra bit til den første strengen av sendte bits, noe som gjør summen av bitene som sendes jevne eller odde. voilà! Du har paritet.

    Start- og stoppbiter ble lagt til den serielle kommunikasjonsprotokollen for å tillate mottakerne å synkronisere på tegnene som sendes. Enbit-paritet tillater ikke feilretting - bare deteksjon. Løsninger på dette problemet kommer fra protokoller som er lagdelt på toppen av de serielle API-ene. Mest seriekommunikasjon i disse dager bruker blokkprotokoller med kontrollsummer (en matematisk funksjon som kan genereres på mottakeren og sammenlignes med den overførte kontrollsummen) som gjør det mulig å oppdage feil på større grupper av biter. Når du kommuniserer med Internett-leverandøren din via PPP, kan pakker være 128 byte per pakke med kontrollsum. Hvis de samsvarer, er du 99,999% sikker på at dataene er i orden.

    Det er tilfeller der denne ordningen ikke fungerer. For eksempel når du sender kritiske kommandoer til enheter som er veldig langt ute i solsystemet, videresende korrigerende protokoller kan bli brukt. Fremadrettende protokoller er nødvendig fordi det ikke kan være tid for en ny sending, og rommet har mye elektromagnetisk støy.

    Ok, tilbake til listen over funksjoner levert av javax.comm API!

  • Den grunnleggende I / O via en underklasse av Java IO-strømmer. For input og output bruker javax.comm API strømmer; konseptet med strømmer skal være kjent for alle Java-programmerere. Det er viktig å gjenbruke Java-konsepter når du bygger ny funksjonalitet, ellers blir APIene uhåndterlige.

  • Strømmer som kan utvides for å gi klientflytekontroll og terskelkontroller. For eksempel kan det hende du vil ha et varsel når det er 10 tegn i bufferen, eller når det bare er 10 steder igjen for tegn. Strømningskontroll er viktig når de to enhetene som er koblet til via et grensesnitt, ikke kan følge med hverandre. Uten flytkontroll kan du ha overskridelser eller underkjøring. I overkjørt tilstand mottok du data før de ble behandlet slik at de gikk tapt. i underkjøringen var du klar for data, men den var ikke tilgjengelig. Vanligvis oppstår disse forholdene ved USART (Universal Synchronous Asynchronous Receiver Transmitter), som er maskinvare som konverterer byte til en seriell bølgeform med timing for å matche overføringshastigheten.

    APIet javax.comm bruker Java-hendelsesmodellen for å varsle om forskjellige signallinjeendringer samt bufferstatus. Tilstandsendringer refererer til veldefinerte signaler spesifisert i RS-232-standarden. For eksempel brukes carrier detect av et modem for å signalisere at det har opprettet en forbindelse med et annet modem, eller det har oppdaget en carrier tone. Å opprette forbindelse eller oppdage en bærertone er en hendelse. Hendelsesgjenkjenning og varsling om endringer er implementert i dette API-et.

Det som ikke er gitt

API-en for javax.comm gir ikke:

  • Linjedisiplinebehandling, oppringingsadministrasjon eller modemadministrasjon. Linjedisiplin refererer til ytterligere behandling av inndata eller utdata. For eksempel er et vanlig etterbehandlingsalternativ konvertering av CR til CR LF. Disse begrepene har sin opprinnelse i de tidlige dagene av teletypene. CR (vognretur) betyr å returnere vognen til venstre margin; i den arabiske verden ville dette være riktig margin. LF (linjefôring) fremrykker utskriftsområdet opp ett. Da bitmapskjermer og laserskrivere kom sammen, ble disse begrepene mindre viktige.

    Dialer management og modemadministrasjon er flere applikasjoner som kan skrives med javax.comm API. Dialer management gir vanligvis et grensesnitt til modemadministrasjonens AT-kommandogrensesnitt. Nesten alle modemer har et AT-kommandogrensesnitt. Dette grensesnittet er dokumentert i modemmanualer.

    Kanskje et lite eksempel vil gjøre dette konseptet klart. Anta at vi har et modem på COM1 og vi vil ringe et telefonnummer. Et Java-oppringingsadministrasjonsprogram vil spørre etter telefonnummeret og forhøre modemet. Disse kommandoene bæres av javax.comm, noe som ikke tolker. For å ringe nummeret 918003210288, for eksempel, sender oppringingsledelsen sannsynligvis et "AT", i håp om å få tilbake et "OK", etterfulgt av ATDT918003210288. En av de viktigste oppgavene for dialeradministrasjon og modemadministrasjon er å håndtere feil og tidsavbrudd.

  • GUI for seriell portadministrasjon. Normalt har serielle porter en dialogboks som konfigurerer de serielle portene, slik at brukerne kan angi parametere som baudrate, paritet og så videre. Følgende diagram viser objektene som er involvert i å lese og / eller skrive data til en seriell port fra Java.

  • Støtte for X-, Y- og Z-modemprotokoller. Disse protokollene gir deteksjon og korrigering av støttefeil.

Programmeringsgrunnlaget

Altfor ofte dykker programmerere rett inn i et prosjekt og koder interaktivt med en API på skjermen uten å tenke på problemet de prøver å løse. For å unngå forvirring og potensielle problemer, samle inn følgende informasjon før du starter et prosjekt. Husk at programmeringsenheter vanligvis krever at du konsulterer en manual.

  1. Få håndboken for enheten og les avsnittet om RS-232-grensesnittet og RS-232-protokollen. De fleste enheter har en protokoll som må følges. Denne protokollen blir båret av javax.comm API og levert til enheten. Enheten vil dekode protokollen, og du må være nøye med å sende data frem og tilbake. Hvis du ikke får den første oppsettet riktig, kan det bety at søknaden din ikke starter, så ta deg tid til å teste ting med et enkelt program. Med andre ord, opprett et program som ganske enkelt kan skrive data til den serielle porten og deretter lese data fra den serielle porten ved hjelp av javax.comm API.

  2. Prøv å få noen kodeeksempler fra produsenten. Selv om de er på et annet språk, kan disse eksemplene være ganske nyttige.

  3. Finn og kode det minste eksemplet du kan for å bekrefte at du kan kommunisere med enheten. Når det gjelder serielle enheter, kan dette være veldig smertefullt - du sender data til en enhet som er koblet til den serielle porten, og ingenting skjer. Dette er ofte resultatet av feil kondisjonering av linjen. Den viktigste regelen for enhetsprogrammering (med mindre du skriver en enhetsdriver) er å sørge for at du kan kommunisere med enheten. Gjør dette ved å finne det enkleste du kan gjøre med enheten din og få det til å fungere.

  4. Hvis protokollen er veldig komplisert, bør du vurdere å skaffe deg en programvare for analyser av RS-232-linjen. Denne programvaren lar deg se på dataene som beveger seg mellom de to enhetene på RS-232-tilkoblingen uten å forstyrre overføringen.

Hvis du bruker javax.comm API vellykket i et program, må du oppgi en eller annen type grensesnitt til enhetsprotokollen ved å bruke den serielle APIen som transportmekanisme. Med andre ord, med unntak av de enkleste enhetene, er det vanligvis et annet lag som kreves for å formatere dataene for enheten. Selvfølgelig er den enkleste protokollen "vanilje" - det betyr at det ikke er noen protokoll. Du sender og mottar data uten tolkning.

Oversikt over foreslåtte trinn for bruk av javax.comm

I tillegg til å gi en protokoll, gjelder ISO-lagdelingsmodellen som brukes for TCP / IP også her ved at vi har et elektrisk lag, etterfulgt av et veldig enkelt byte-transportlag. På toppen av dette byte-transportlaget kan du legge transportlaget ditt. For eksempel kan PPP-stakken din bruke javax.comm API for å overføre byte frem og tilbake til modemet. Rollen til javax.comm-laget er ganske liten når man ser på det i denne sammenhengen:

  1. Gi javax.comm API-kontroll på noen av enhetene. Før du bruker en enhet, må javax.comm API vite om det.

  2. Åpne enheten og kondisjonere linjen. Du kan ha en enhet som krever en overføringshastighet på 115 kilobit uten paritet.

  3. Skriv data og / eller les data etter hvilken protokoll enheten du kommuniserer med krever. Hvis du for eksempel kobler til en skriver, kan det hende du må sende en spesiell kode for å starte skriveren og / eller avslutte jobben. Noen PostScript-skrivere krever at du avslutter jobben ved å sende CTRL-D 0x03.

  4. Lukk porten.

Initialiserer API-registeret javax.comm med serielle grensesnittporter

APIet for javax.comm kan bare administrere porter som den er klar over. Den siste versjonen av API-en krever ikke at noen porter skal initialiseres. Ved oppstart søker javax.comm API etter porter på den aktuelle verten og legger dem til automatisk.

Du kan initialisere serielle porter som javax.comm API kan bruke. For enheter som ikke følger standard navngivningskonvensjon, kan du legge dem til eksplisitt ved å bruke kodesegmentet nedenfor.

// Registrer enheten 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); 

Åpnings- og kondisjoneringsanordninger

Denne neste kodeeksemplet viser hvordan du legger til, kondisjonerer og åpner en enhet. Detaljer om de spesifikke metodeanropene er på API-sidene for javax.comm. Dette eksemplet setter enheten kalt XYZSerialDevice til å være tilgjengelig med navn GenericSerialReader. Enheten som er koblet til på denne linjen har en baudrate på 9600, 1 stoppbit, et tegn på 8 bits (ja, de kan være mindre) og ingen paritet. Resultatet av alt dette er å gi to strømmer - en for lesing og en annen for skriving.

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