Java mendapat dukungan serial dengan paket javax.comm baru

API Komunikasi Java (alias javax.comm) adalah ekstensi standar yang diusulkan yang memungkinkan penulis aplikasi komunikasi untuk menulis perangkat lunak Java yang mengakses port komunikasi dengan cara yang tidak bergantung platform. API ini dapat digunakan untuk menulis perangkat lunak emulasi terminal, perangkat lunak faks, perangkat lunak pembaca kartu pintar, dan sebagainya.

Mengembangkan perangkat lunak yang baik biasanya berarti memiliki antarmuka yang jelas. Diagram tingkat tinggi dari lapisan antarmuka API ditunjukkan pada gambar ini.

Pada artikel ini kami akan menunjukkan kepada Anda bagaimana menggunakan javax.comm untuk berkomunikasi dengan perangkat serial berbasis RS-232. Kami juga akan membahas apa yang disediakan javax.comm API dan apa yang tidak disediakannya. Kami akan menyajikan program contoh kecil yang menunjukkan cara berkomunikasi ke port serial menggunakan API ini. Di akhir artikel kami akan menjelaskan secara singkat bagaimana API javax.comm ini akan bekerja dengan driver perangkat lain, dan kami akan membahas persyaratan untuk melakukan port asli API ini ke OS tertentu.

Tidak seperti driver klasik, yang datang dengan model komunikasi kejadian asinkron mereka sendiri, API javax.comm menyediakan antarmuka bergaya kejadian berdasarkan model kejadian Java (paket java.awt.event). Katakanlah kita ingin tahu apakah ada data baru yang ada di buffer input. Kita dapat mengetahuinya dengan dua cara - dengan polling atau mendengarkan . Dengan polling, prosesor memeriksa buffer secara berkala untuk melihat apakah ada data baru di buffer. Dengan mendengarkan, prosesor menunggu terjadinya suatu peristiwa berupa data baru di buffer input. Segera setelah data baru tiba di buffer, ia mengirimkan pemberitahuan atau peristiwa ke prosesor.

Di antara berbagai antarmuka serial yang tersedia, dua yang paling populer adalah standar RS-232C dan RS-422, yang menentukan level sinyal listrik dan arti dari berbagai jalur sinyal. Antarmuka serial kecepatan rendah biasanya mencatat data sebagai gelombang persegi, dengan koordinasi jam yang disediakan oleh bit start dan stop.

RS-232 adalah singkatan dari Recommend Standard 232 ; yang C hanya mengacu pada revisi terbaru dari standar. Port serial pada kebanyakan komputer menggunakan subset dari standar RS-232C. Standar penuh RS-232C menentukan konektor "D" 25-pin, yang menggunakan 22 pin. Sebagian besar pin ini tidak diperlukan untuk komunikasi PC normal, dan memang, sebagian besar PC baru dilengkapi dengan konektor tipe D jantan yang hanya memiliki 9 pin. Untuk lebih lanjut tentang RS-232, lihat bagian Sumber.

Catatan: Untuk pemahaman tentang apa yang telah dilakukan driver lain di masa lalu, lihatlah termiohalaman manual Unix atau OpenBSD Unix, variasi dari sumber driver BSD Unix. Ini tersedia gratis di Internet. Silakan lihat bagian Sumber Daya untuk informasi lebih lanjut.

API javax.comm: Apa yang disediakan

API javax.comm menyediakan fungsionalitas berikut untuk pengembang:

  • Spesifikasi API lengkap untuk port komunikasi serial dan paralel. (Dalam artikel ini kami hanya mempertimbangkan port serial.) Tanpa API umum dalam upaya pengembangan Anda, beban kerja akan meningkat karena Anda harus memberikan dukungan ke perangkat serial.

  • Kontrol penuh dari semua parameter framing serial (baud stop bits, parity, bits / frame) serta kontrol manual atau otomatis dari jalur kontrol aliran. Biasanya, di RS-232 terdapat dua jalur sinyal dan sisanya ditujukan untuk jalur kendali. Bergantung pada jenis komunikasi (sinkron atau asinkron), jumlah jalur kontrol yang dipilih dapat bervariasi. API ini menyediakan akses ke sinyal kontrol yang mendasarinya.

    Pengalihan singkat di sini dapat membantu Anda memahami sesuatu tentang paritas dan bit start dan stop. Paritas ditambahkan ke RS-232 karena jalur komunikasi dapat berisik. Katakanlah kita mengirim ASCII 0 , yang dalam hex sama dengan 0x30 (atau 00110000 dalam biner), tetapi di sepanjang jalan seseorang lewat dengan memegang magnet, menyebabkan salah satu bit berubah. Akibatnya, alih-alih mengirim 8 bit seperti yang diinginkan, bit tambahan ditambahkan ke string bit pertama yang dikirim, membuat jumlah total bit yang dikirim genap atau ganjil. voila ! Anda punya paritas.

    Bit start dan stop ditambahkan ke protokol komunikasi serial untuk memungkinkan penerima melakukan sinkronisasi pada karakter yang dikirim. Paritas satu bit tidak memungkinkan koreksi kesalahan - hanya deteksi. Solusi untuk masalah ini berasal dari protokol yang dilapisi di atas API serial. Sebagian besar komunikasi serial saat ini menggunakan protokol blok dengan checksum (fungsi matematika yang dapat dihasilkan pada penerima dan dibandingkan dengan checksum yang dikirim) yang memungkinkan kesalahan terdeteksi pada kelompok bit yang lebih besar. Saat Anda berkomunikasi dengan ISP melalui PPP, paket mungkin berukuran 128 byte per paket dengan checksum. Jika cocok, Anda 99,999% yakin datanya baik-baik saja.

    Ada kasus di mana skema ini tidak berhasil. Misalnya, saat mengirim perintah penting ke perangkat yang berada sangat jauh di tata surya, protokol koreksi ke depan dapat digunakan. Protokol koreksi ke depan diperlukan karena mungkin tidak ada waktu untuk transmisi ulang, dan ruang memiliki banyak gangguan elektromagnetik.

    Oke, kembali ke daftar fungsi yang disediakan oleh API javax.comm!

  • I / O dasar melalui subclass dari aliran IO Java. Untuk input dan output, API javax.comm menggunakan aliran; konsep stream harus familiar bagi semua programmer Java. Penting untuk menggunakan kembali konsep Java saat membangun fungsionalitas baru atau API akan menjadi berat.

  • Aliran yang dapat diperpanjang untuk memberikan kontrol aliran klien dan kontrol ambang batas. Misalnya, Anda mungkin menginginkan peringatan ketika ada 10 karakter dalam buffer atau ketika hanya ada 10 lokasi tersisa untuk karakter. Kontrol aliran penting ketika dua perangkat yang terhubung melalui antarmuka tidak dapat saling mengimbangi. Tanpa kontrol aliran, Anda dapat mengalami kelebihan atau kekurangan . Dalam kondisi overrun, Anda menerima data sebelum diproses sehingga hilang; di underrun, Anda siap untuk data tetapi tidak tersedia. Biasanya kondisi ini terjadi pada USART (Universal Synchronous Asynchronous Receiver Transmitter), yang merupakan perangkat keras yang mengubah byte menjadi bentuk gelombang serial dengan pengaturan waktu agar sesuai dengan baud rate.

    API javax.comm menggunakan model kejadian Java untuk memberikan pemberitahuan tentang berbagai perubahan garis sinyal serta status buffer. Perubahan status mengacu pada sinyal yang ditentukan dengan baik yang ditentukan dalam standar RS-232. Misalnya, deteksi operator digunakan oleh modem untuk memberi sinyal bahwa ia telah membuat sambungan dengan modem lain, atau telah mendeteksi nada pembawa. Membuat koneksi atau mendeteksi nada pembawa adalah sebuah peristiwa. Deteksi peristiwa dan pemberitahuan perubahan diimplementasikan dalam API ini.

Apa yang tidak disediakan

API javax.comm tidak menyediakan:

  • Pemrosesan jenis disiplin garis, manajemen dialer, atau manajemen modem. Disiplin garis mengacu pada pemrosesan tambahan dari karakter input atau output. Misalnya, satu opsi pasca-pemrosesan yang umum adalah konversi CR ke CR LF. Istilah-istilah ini berasal dari masa-masa awal teletipe. CR (carriage return) berarti mengembalikan kereta ke margin kiri; di dunia Arab, ini akan menjadi margin kanan. LF (pengumpanan baris) memajukan area pencetakan satu per satu. Ketika layar bitmap dan printer laser muncul, istilah ini menjadi kurang penting.

    Manajemen dialer dan manajemen modem adalah aplikasi tambahan yang dapat ditulis menggunakan API javax.comm. Manajemen dialer biasanya menyediakan antarmuka ke antarmuka perintah AT manajemen modem. Hampir semua modem memiliki antarmuka perintah AT. Antarmuka ini didokumentasikan dalam manual modem.

    Mungkin sedikit contoh akan membuat konsep ini menjadi jelas. Misalkan kita memiliki modem pada COM1 dan kita ingin menghubungi nomor telepon. Aplikasi manajemen dialer Java akan menanyakan nomor telepon dan menginterogasi modem. Perintah ini dibawa oleh javax.comm, yang tidak memiliki interpretasi. Untuk menghubungi nomor 918003210288, misalnya, manajemen telepon mungkin mengirimkan "AT," berharap mendapatkan kembali "OK," diikuti oleh ATDT918003210288. Salah satu tugas terpenting dari manajemen dialer dan manajemen modem adalah menangani kesalahan dan batas waktu.

  • GUI untuk manajemen port serial. Biasanya, port serial memiliki kotak dialog yang mengkonfigurasi port serial, memungkinkan pengguna untuk mengatur parameter seperti baud rate, parity, dan sebagainya. Diagram berikut menggambarkan objek yang terlibat dalam membaca dan / atau menulis data ke port serial 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.