Artikel ini menjelaskan fungsi komunikasi serial yang diimplementasikan oleh Java. Bagikan untuk referensi Anda, sebagai berikut:
Untuk mengimplementasikan komunikasi serial menggunakan Java (di bawah sistem Windows), Anda perlu menggunakan paket port serial Javacomm20-win32.zip disediakan oleh Sun. Tiga file digunakan, dan konfigurasinya adalah sebagai berikut:
1.Comm.jar ditempatkan di java_home/jre/lib/ext;
2.Place win32com.dll ke java_home/bin;
3.javax.comm.properties kedua tempat harus ditempatkan
JRE/LIB (yaitu, JRE di bawah folder Java)
Java_home/jre/lib
Izinkan saya berbicara tentang lingkungan yang saya terapkan. Saat menimbang skala elektronik, komputer mengirimkan perintah "R" ke monitor kontrol penimbangan melalui port serial, dan monitor kontrol mengirimkan data berat ke port serial sekali, dan komputer kemudian membaca data untuk menampilkannya di halaman web. Ini membentuk sistem penimbangan waktu nyata.
Kode untuk membaca dan menulis port serial adalah sebagai berikut:
package com.chengzhong.tools;import java.io.*;import javax.comm.CommPortIdentifier;import javax.comm.*;/**** This bean provides some basic functions to implement full duplex* information exchange through the serial port.**/public class SerialBean{public static String PortName;public static CommPortIdentifier portId;public static SerialPort serialPort;public static OutputStream out; public static inputstream in; // simpan hasil bacaan hasil string statis publik = ""; public static int opensignal = 1;/**** konstruktor ** @param portid id serial yang akan digunakan. 1 untuk com1,*2 untuk com2, dll. **/Serialbean publik (int portid) {portname = "com" +portid;}/**** Fungsi ini menginisialisasi port serial untuk komunikasi. Ini memulai utas* yang secara konsisten memantau port serial. Sinyal apa pun yang ditangkap*dari port serial disimpan ke dalam area buffer. **/public int initialize () {OpenSignal = 1; coba {portId = commportImentifier.getPortIdentifier (portName); coba {serialport = (serialport) portid.open ("Serial_Communication", 2000); } catch (portinUseException e) {if (! SerialBean.portid.getCurrentOwner (). Equals ("Serial_Communication")) {OpenSignal = 2; // port serial ini ditempati oleh program lain} lain jika (serialbean.portid.getCurrentOwner (). Equals ("Serial_Communication")) {OpenSignal = 1; Return OpenSignal; } return OpenSignal; } // Gunakan InputStream In untuk membaca dari port serial, dan OutputStream // Out untuk menulis ke port serial. coba {in = serialport.getInputStream (); out = serialport.getoutputStream (); } catch (ioException e) {OpenSignal = 3; // Inisialisasi parameter komunikasi ke 9600, 8, 1, tidak ada. coba {Serialport.SetSerialPortParams (9600, Serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (UnsupportedCommoperationException e) {OpenSignal = 4; // parameternya salah pengembalian OpenSignal; }} catch (nosuchportException e) {portid = null; OpenSignal = 5; // Tidak ada Serial Port Return OpenSignal; } // Ketika berhasil membuka port serial, buat buffer serial baru, // kemudian buat utas yang secara konsisten menerima sinyal masuk dari // port serial. Sinyal yang masuk disimpan dalam buffer serial.// Mengembalikan informasi yang berhasil OpenSignal;}/**** Fungsi ini mengembalikan string dengan panjang tertentu dari pesan yang masuk*. while (in.available ()> 0) {c = in.read (); Karakter d = karakter baru ((char) c); SerialBean.Result = SerialBean.Result.concat (D.Tostring ()); }}} catch (ioException e) {// TODO Auto-dibuat blok tangkapan autoerated e.printstacktrace ();}}/**** Fungsi ini mengirim pesan melalui port serial. ** @param msg string yang akan dikirim. **/public static writeport (string msg) {try {if oUs; Msg.length (); i ++) out.write (msg.charat (i)); }} catch (ioException e) {return;}}/**** Fungsi ini menutup port serial yang digunakan. **/public void closeport () {serialport.close ();}} Dengan cara ini, Anda bisa mendapatkan hasil bacaan melalui SerialBean.result .
Adapun menempatkan data di halaman web, AJAX perlu digunakan. Berikut adalah kerangka AJAX DWR, kelas DWR put.java digunakan sebagai berikut:
Paket com.chengzhong.dwr; impor java.io.ioexception; import com.chengzhong.tools.arith; import com.chengzhong.tools.serialbean; kelas publik put {//2011.9.17 PUBLIK PUBLIK Write () {// Kirim instruksi r, instrumen mengirim data bobot bersih serialbean. // Baca data serialbean.readport (); String temp = serialbean.result.trim (); // Saya temp di sini untuk menjadi wn125.000kg data if (! Temp.equals ("") && temp.length () == 11) {return (ubah (temp)). Tostring (); } else {return ""; }} // Respons Mulai menimbang string public string start weight (string num) {int n = integer.parseint (num.trim ()); Serialbean SB = Serialbean baru (n); SB.Initialize (); return serialbean.opensignal+""; // Mengembalikan informasi inisialisasi} // respons berhenti menimbang public endweight () {coba {// tutup input dan output streaming serialbean.in.close (); Serialbean.out.close (); } catch (ioException e) {// TODO AUTO-ENCEALATED Catch Block E.PrintStackTrace (); } if (serialbean.serialport! = null) {serialbean.serialport.close (); // tutup port serial} serialbean.serialport = null; Serialbean.portId = null; Serialbean.Result = ""; } / ** * Konversi bobot dalam format WN125.000kg menjadi 125.000 (kg) (bulat, dua digit dipertahankan setelah titik desimal) * / perubahan string publik (sumber string) {hasil ganda = 0,0; String s1 = source.substring (2,9); coba {result = double.parsedouble (s1); hasil = arith.round (hasil, 2); } catch (Exception e) {E.PrintStackTrace (); kembali ""; } return result.toString (); }}Catatan: Arith.java adalah file perhitungan presisi tinggi untuk Java.
Paket com.chengzhong.tools; impor java.math.bigdecimal;/*** Karena tipe sederhana Java tidak dapat secara akurat melakukan operasi pada bilangan titik mengambang, kelas alat ini menyediakan operasi titik mengambang yang akurat, termasuk penambahan, pengurangan, perkalian dan divisi, dan pembulatan. */Kelas Publik Arith {// Divisi Default Accuracy Private Static Final Int DEF_DIV_SCALE = 10; // Kelas ini tidak dapat dipakai secara pribadi Arith () {} /*** menyediakan operasi penambahan yang akurat. * @param v1 menambahkan* @param v2 add* @return Jumlah dari dua parameter*/ public static double add (double v1, double v2) {BigDecimal b1 = baru BigDecimal (double.toString (v1)); BigDecimal B2 = BigDecimal baru (Double.ToString (V2)); return b1.add (b2) .doublevalue (); } /*** menyediakan operasi pengurangan yang akurat. * @param V1 dikurangi* @param V2 dikurangi* @return Perbedaan antara dua parameter*/ public static ganda sub (v1 ganda, v2 ganda) {BigDecimal B1 = BigDecimal baru (double.toString (v1)); BigDecimal B2 = BigDecimal baru (Double.ToString (V2)); return b1.subtract (b2) .doublevalue (); } /*** Menyediakan operasi multiplikasi yang akurat. * @param V1 Multiplier* @param V2 Multiplier* @Return Produk dari dua parameter*/ MUL ganda statis publik (v1 ganda, v2 ganda) {BigDecimal B1 = BigDecimal baru (Double.ToString (V1)); BigDecimal B2 = BigDecimal baru (Double.ToString (V2)); return b1.multiply (b2) .doublevalue (); } /** * Menyediakan (relatif) operasi pembagian yang akurat, ketika tidak ada divisi, itu akurat untuk * 10 digit setelah titik desimal, dan angka -angka selanjutnya dibulatkan. * @param V1 Divider* @param V2 Divider* @Return kutipan dari dua parameter*/ public static div double (double v1, double v2) {return div (v1, v2, def_div_scale); } /*** Menyediakan (relatif) operasi pembagian yang akurat. Ketika tidak ada akhir untuk menyelesaikan pemisahan, parameter skala mengacu pada keakuratan *, dan angka -angka selanjutnya dibulatkan. * @param V1 Divider* @param V2 Divider* @param Skala berarti bahwa ia harus akurat untuk beberapa digit setelah titik desimal. * @return quotient dari dua parameter*/ public static div ganda (v1 ganda, v2 ganda, skala int) {if (skala <0) {lempar baru ilegalargumentException ("Skala harus berupa bilangan bulat positif atau nol"); } BigDecimal B1 = BigDecimal baru (Double.ToString (V1)); BigDecimal B2 = BigDecimal baru (Double.ToString (V2)); return b1.divide (b2, skala, bigdecimal.round_half_up) .doublevalue (); } /*** Menyediakan pembulatan desimal yang akurat. * @param V menghitung yang perlu dibulatkan* @param skala berapa banyak digit yang dipertahankan setelah titik desimal* @return hasilnya setelah pembulatan*/ public static round double (ganda v, skala int) {if (skala <) {lempar baru ilegalargumentException ("skala harus berupa integer positif atau nol"); } BigDecimal b = BigDecimal baru (double.toString (v)); BigDecimal One = BigDecimal baru ("1"); return b.divide (satu, skala, bigdecimal.round_half_up) .doublevalue (); }}Di halaman web:
<Tipe Script = "Teks/JavaScript" src = "/chengzhong/dwr/mesin type = 'text/javascript'> var id; fungsi begin () {id = window.setInterval ('get ()', 500); // Secara otomatis memanggil get () setiap setengah detik, dapatkan data berat kotor dan isi di kotak teks} function get () {ss.write (readit); // Memanggil metode tulis di kelas DWR put.java} function readit (data) {if (data! = Null && data! = "") {Document.getElementById ("mzbf"). Value = data; }} </script>Saya tidak akan berbicara tentang penggunaan DWR
For more information about Java related content, please check out the topics of this site: "Summary of Java Socket Programming Skills", "Summary of Java File and Directory Operation Skills", "Tutorial on Java Data Structure and Algorithm", "Summary of Java Operation DOM Node Skills" and "Summary of Java Cache Operation Skills"
Saya harap artikel ini akan membantu pemrograman Java semua orang.