Java mendapat sokongan bersiri dengan pakej javax.comm baru

Java Communications (aka javax.comm) API adalah lanjutan standard yang dicadangkan yang membolehkan pengarang aplikasi komunikasi menulis perisian Java yang mengakses port komunikasi dengan cara yang tidak bergantung pada platform. API ini boleh digunakan untuk menulis perisian emulasi terminal, perisian faks, perisian pembaca kad pintar, dan sebagainya.

Membangunkan perisian yang baik biasanya bermaksud mempunyai antara muka yang jelas. Gambarajah tahap tinggi lapisan antara muka API ditunjukkan dalam gambar ini.

Dalam artikel ini kami akan menunjukkan kepada anda cara menggunakan javax.comm untuk berkomunikasi dengan peranti bersiri berdasarkan RS-232. Kami juga akan membincangkan apa yang disediakan API javax.comm dan apa yang tidak disediakan. Kami akan menunjukkan program contoh kecil yang menunjukkan kepada anda cara berkomunikasi ke port bersiri menggunakan API ini. Pada akhir artikel kami akan menerangkan secara ringkas bagaimana API javax.comm ini akan berfungsi dengan pemacu peranti lain, dan kami akan membahas syarat untuk melakukan port asli API ini ke OS tertentu.

Tidak seperti pemacu klasik, yang dilengkapi dengan model komunikasi acara asinkron mereka sendiri, API javax.comm menyediakan antara muka gaya acara berdasarkan model acara Java (pakej java.awt.event). Katakanlah kita ingin tahu sama ada terdapat data baru yang terdapat di buffer input. Kita dapat mengetahuinya dengan dua cara - dengan mengundi atau mendengar . Dengan pengundian, pemproses memeriksa penyangga secara berkala untuk melihat apakah ada data baru dalam penyangga. Dengan mendengar, pemproses menunggu peristiwa berlaku dalam bentuk data baru dalam buffer input. Sebaik sahaja data baru tiba di penyangga, ia akan mengirimkan pemberitahuan atau acara kepada pemproses.

Di antara pelbagai antara muka bersiri yang ada, dua yang paling popular adalah piawaian RS-232C dan RS-422, yang menentukan tahap isyarat elektrik dan makna pelbagai garis isyarat. Antaramuka bersiri berkelajuan rendah biasanya data jam keluar sebagai gelombang persegi, dengan koordinasi jam disediakan oleh bit permulaan dan berhenti.

RS-232 bermaksud Stand Standard 232 ; yang C hanya merujuk kepada pindaan terkini piawaian. Port bersiri pada kebanyakan komputer menggunakan subset standard RS-232C. Piawaian RS-232C lengkap menentukan penyambung "D" 25-pin, di mana 22 pin digunakan. Sebilangan besar pin ini tidak diperlukan untuk komunikasi PC biasa, dan memang, kebanyakan PC baru dilengkapi dengan penyambung jenis D lelaki yang hanya mempunyai 9 pin. Untuk maklumat lanjut mengenai RS-232, lihat bahagian Sumber.

Catatan: Untuk memahami apa yang dilakukan pemandu lain pada masa lalu, lihat termiohalaman manual Unix atau OpenBSD Unix, variasi sumber pemacu BSD Unix. Ini boleh didapati secara percuma di Internet. Sila lihat bahagian Sumber untuk maklumat lebih lanjut.

API javax.comm: Apa yang disediakan

API javax.comm menyediakan fungsi berikut kepada pemaju:

  • Spesifikasi API yang lengkap untuk port komunikasi bersiri dan selari. (Dalam artikel ini kami hanya mempertimbangkan port bersiri.) Tanpa API umum dalam usaha pengembangan Anda, beban kerja akan meningkat kerana anda harus memberikan sokongan kepada peranti bersiri.

  • Kawalan penuh semua parameter pembingkaian bersiri (baud stop bits, parity, bit / frame) serta kawalan manual atau automatik dari garis kawalan aliran. Biasanya, di RS-232, terdapat dua garis isyarat dan selebihnya ditujukan untuk garis kawalan. Bergantung pada jenis komunikasi (segerak atau tidak segerak), bilangan talian kawalan yang dipilih mungkin berbeza. API ini memberikan akses ke isyarat kawalan yang mendasari.

    Pengalihan ringkas di sini dapat membantu anda memahami sesuatu mengenai pariti dan memulakan dan menghentikan sedikit. Parity ditambahkan ke RS-232 kerana saluran komunikasi boleh bising. Katakanlah kita mengirim ASCII 0 , yang dalam hex sama dengan 0x30 (atau 00110000 dalam binari), tetapi sepanjang jalan seseorang melintas dengan memegang magnet, menyebabkan salah satu bit berubah. Akibatnya, alih-alih mengirim 8 bit seperti yang diharapkan, bit tambahan ditambahkan pada rentetan bit pertama yang dikirim, menjadikan jumlah bit yang dikirim sama atau ganjil. voilĂ  ! Anda mempunyai pariti.

    Bit mula dan berhenti ditambahkan ke protokol komunikasi bersiri untuk membolehkan penerima menyegerakkan watak yang dihantar. Pariti satu bit tidak membenarkan pembetulan ralat - hanya pengesanan. Penyelesaian untuk masalah ini datang dari protokol yang berlapis di atas API bersiri. Kebanyakan komunikasi bersiri pada masa ini menggunakan protokol blok dengan checksum (fungsi matematik yang dapat dihasilkan pada penerima dan dibandingkan dengan checksum yang dihantar) yang membolehkan ralat dikesan pada kumpulan bit yang lebih besar. Semasa anda berkomunikasi dengan ISP anda melalui PPP, paket mungkin 128 byte per paket dengan checksum. Sekiranya sesuai, anda pasti 99,999% datanya baik-baik saja.

    Terdapat kes di mana skema ini tidak berfungsi. Contohnya, ketika mengirim perintah kritikal ke peranti yang sangat jauh di dalam sistem suria, protokol pembetulan ke depan dapat digunakan. Protokol pembetulan ke hadapan diperlukan kerana mungkin tidak ada waktu untuk penghantaran semula, dan ruang mempunyai banyak bunyi elektromagnetik.

    Baiklah, kembali ke senarai fungsi yang disediakan oleh API javax.comm!

  • I / O asas melalui subkelas aliran IO Java. Untuk input dan output, API javax.comm menggunakan aliran; konsep aliran harus tidak asing lagi bagi semua pengaturcara Java. Penting untuk menggunakan kembali konsep Java ketika membangun fungsi baru atau API akan menjadi tidak berat sebelah.

  • Aliran yang dapat diperluas untuk memberikan kawalan aliran pelanggan dan kawalan ambang. Sebagai contoh, anda mungkin mahukan amaran apabila terdapat 10 aksara dalam penyangga atau apabila hanya tinggal 10 lokasi untuk watak. Kawalan aliran penting apabila kedua-dua peranti yang disambungkan melalui antara muka tidak dapat bersaing antara satu sama lain. Tanpa kawalan aliran, anda boleh mengalami overrun atau underrun . Dalam keadaan keterlaluan, anda menerima data sebelum diproses sehingga hilang; dalam keadaan underrun, anda sudah bersedia untuk data tetapi tidak tersedia. Biasanya keadaan ini berlaku di USART (Universal Synchronous Asynchronous Receiver Transmitter), yang merupakan perkakasan yang menukar bait ke bentuk gelombang bersiri dengan masa untuk menyamai kadar baud.

    API javax.comm menggunakan model peristiwa Java untuk memberikan pemberitahuan mengenai berbagai perubahan garis isyarat dan juga status penyangga. Perubahan keadaan merujuk kepada isyarat yang ditentukan dengan baik yang dinyatakan dalam standard RS-232. Sebagai contoh, pengesan pembawa digunakan oleh modem untuk memberi isyarat bahawa ia telah membuat sambungan dengan modem lain, atau ia telah mengesan nada pembawa. Membuat sambungan atau mengesan nada pembawa adalah peristiwa. Pengesanan peristiwa dan pemberitahuan perubahan dilaksanakan di API ini.

Apa yang tidak disediakan

API javax.comm tidak menyediakan:

  • Pemprosesan jenis disiplin talian, pengurusan pendail, atau pengurusan modem. Disiplin baris merujuk kepada pemprosesan tambahan watak input atau output. Sebagai contoh, satu pilihan pasca pemprosesan yang biasa adalah penukaran CR menjadi CR LF. Istilah ini mempunyai asal usulnya pada awal teletype. CR (pengembalian kereta) bermaksud untuk mengembalikan kereta sederhana ke margin kiri; dalam dunia Arab, ini adalah margin yang tepat. LF (feed line) memajukan kawasan percetakan satu demi satu. Apabila skrin bitmap dan pencetak laser muncul, syarat-syarat ini menjadi kurang penting.

    Pengurusan pendail dan pengurusan modem adalah aplikasi tambahan yang boleh ditulis menggunakan API javax.comm. Pengurusan pendail biasanya menyediakan antara muka ke antara muka arahan AT pengurusan modem. Hampir semua modem mempunyai antara muka perintah AT. Antara muka ini didokumentasikan dalam manual modem.

    Mungkin sedikit contoh akan menjadikan konsep ini jelas. Katakan kita mempunyai modem di COM1 dan kita mahu mendail nombor telefon. Aplikasi pengurusan pendail Java akan meminta nombor telefon dan menyoal siasat modem. Perintah ini dijalankan oleh javax.comm, yang tidak mempunyai tafsiran. Sebagai contoh, untuk mendail nombor 918003210288, pihak pengurusan pendail mungkin menghantar "AT", dengan harapan mendapat kembali "OK", diikuti oleh ATDT918003210288. Salah satu tugas terpenting dalam pengurusan pendail dan pengurusan modem adalah menangani kesilapan dan masa tamat.

  • GUI untuk pengurusan port bersiri. Biasanya, port bersiri mempunyai kotak dialog yang mengkonfigurasi port bersiri, yang membolehkan pengguna menetapkan parameter seperti baud rate, parity, dan sebagainya. Gambar rajah berikut menggambarkan objek yang terlibat dalam membaca dan / atau menulis data ke port bersiri dari Java.

  • Support for X, Y, and Z modem protocols. These protocols provide support error detection and correction.

The programming basics

Too often, programmers dive right into a project and code interactively with an API on the screen without giving any thought to the problem they are trying to solve. To avoid confusion and potential problems, gather the following information before you start a project. Remember, programming devices usually requires that you consult a manual.

  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.