Kursus baru -baru ini membutuhkan penulisan alat komunikasi serial untuk komputer atas. Saya menulis alat komunikasi serial sederhana dengan antarmuka grafis berdasarkan Java. Proses ini akan dijelaskan secara rinci di bawah ini untuk referensi Anda^_^
satu:
Pertama -tama, Anda perlu mengunduh paket JAR tambahan yang mendukung operasi komunikasi port serial Java. Karena Java.Comm relatif tua dan tidak mendukung sistem 64-bit, direkomendasikan bahwa paket JAR RXTX (keduanya dukungan 32-bit/64-bit).
Alamat unduhan resmi: http://fizzed.com/oss/rxtx-for-java (Catatan: FQ mungkin diperlukan untuk mengunduh)
Sepatu anak -anak yang tidak bisa FQ dapat diunduh di sini:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32-bit)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64-bit)
dua:
Unduh Paket Jar Unzip dan perkenalkan di bawah Java Build Path:
menangkap
Catatan: Jika kesalahan java.lang.unsatisfiedlinkerror dilemparkan selama operasi, silakan salin dua file rxtxparallel.dll dan rxtxserial.dll dalam paket dekompresi rxtx ke direktori c:/windows/system32 untuk menyelesaikan kesalahan.
tiga:
Mengenai penggunaan paket JAR ini, saya menulis kelas serialtool.java, yang menyediakan berbagai layanan sederhana untuk komunikasi port serial. Kode ini adalah sebagai berikut (perhatikan bahwa kelas ini terletak di paket Serialport):
Paket Serialport; impor java.io.ioException; impor java.io.inputstream; import java.io.outputstream; import java.util.arraylist; impor java.util.enumeration; import java.util.toomanylistenersException; impor gnu.io.commport; gnu.io.nosuchportException; impor gnu.io.portinuseexception; impor gnu.io.serialport; impor gnu.io.serialportEventListener; portir porsial dan porsial portial dan closing soalexception. mode desain singleton) * @author zhong * */kelas publik serialtool {private static serialtool serialtool = null; static {// inisialisasi objek SerialTool Ketika kelas ini dimuat oleh ClassLoader if (serialtool == null) {serialtool = new SerialTool (); }} // Konstruktor kelas SerialTool pribadi tidak diperbolehkan menghasilkan objek SerialTool SerialTool () {} /*** Dapatkan objek SerialTool yang menyediakan layanan* @return serialtool* /public static SerialTool geterialtool () {if (serialtool == nulli) {serialtool =) {if (serialtool == nulli) {serialtool =) {if (serialtool == nulli) {serialtool =) {if (serialtool == nulli) {serialtool =) {if serialtool == NULL) {serialtool = Serial) {if if (serialTool == NULL) {SERIALTOOL =) {SerialTool == NULL) {Serial) {SerialTool == NULLEOL () } return SerialTool; } /*** Temukan semua port yang tersedia* @Return Daftar nama port yang tersedia* /Public Static Final ArrayList <String> findport () {// Dapatkan semua enumerasi port serial yang tersedia saat ini <CommPortIdentifier> portlist = commportIdentifier.getportIdentifiers (); ArrayList <String> portnamelist = ArrayList baru <> (); // Tambahkan nama port serial yang tersedia untuk daftar dan mengembalikan daftar while (portlist.hasmoreElements ()) {string portName = portlist.nextElement (). GetName (); portnamelist.add (portname); } return portnelist; } /*** Buka port serial* @param portname nama port* @param baudrate Baudrate* @return Serialport objek* @Throws SerialportParameterFailure Gagal mengatur parameter port serial* @throws notasealport yang menunjuk pada perangkat ini bukan jenis port serial* @throws nosuchport di dalamnya tidak ada nosucport. Public Static Final Serialport Openport (String PortName, Int Baudrate) melempar SerialportParameterFailure, Notaserialport, Nosuchport, Portinuse {try {// Identifikasi port dengan nama port CommportIdentifier portIdentifier = commportIfier.getPortIdentifier (portName); // buka port dan berikan nama port dan batas waktu (waktu batas waktu operasi pembukaan) Commport = portIdentifier.open (portname, 2000); // pertahanan apakah itu port serial if (instance commport dari serialport) {serialport serialport = (serialport) commport; coba {// atur baud rate dan parameter lain dari serial port serialport.seterialportParams (baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (UnsupportedCommoperationException e) {lempar serialportParameterFailure baru (); } //System.out.println("open " + portname +" sukses! "); mengembalikan Serialport; } else {// bukan port serial melempar notaserialport baru (); }} catch (nosuchportException e1) {lempar nosuchport baru (); } catch (portinuseException e2) {lempar portinuse baru (); }} / *** Tutup port serial* @param serialport objek port serial yang akan ditutup* / public static void closeport (serialport serialport) {if (serialport! = Null) {serialport.close (); Serialport = null; } } /** * Send data to the serial port* @param serialPort Serialport object* @param order Data to be sent* @throws SendDataToSerialPortFailure Failed to send data to the serial port* @throws SerialPortOutputStreamCloseFailure Close the output stream error of the serial port object*/ public static void sendToPort(SerialPort serialPort, byte[] order) throws SendDataToSerialportFailure, serialportOutputStreamCloseFailure {outputStream out = null; coba {out = serialport.getoutputStream (); out.write (pesanan); out.flush (); } catch (ioException e) {lempar SendDataToSerialPortFailure baru (); } akhirnya {coba {if (out! = null) {out.close (); keluar = null; }} catch (ioException e) {lempar serialportOutputStreamCloseFailure baru (); } } } /** * Read data from the serial port* @param serialPort The SerialPort object with a connection has been established* @return The data read* @throws ReadDataFromSerialPortFailure An error occurred while reading data from the serial port* @throws SerialPortInputStreamCloseFailure Close serial port object input stream error*/ public static byte[] readFromPort(SerialPort serialPort) throws ReadDataFromserialportFailure, serialportInputStreamCloseFailure {inputStream in = null; byte [] bytes = null; coba {in = serialport.getInputStream (); int Bufflenth = in.available (); // Dapatkan panjang data dalam buffer while (Bufflenth! = 0) {bytes = byte baru [Bufflenth]; // inisialisasi array byte ke panjang data dalam buffer in.read (byte); Bufflenth = in.available (); }} catch (ioException e) {lempar readdatafromserialportFailure baru (); } akhirnya {coba {if (in! = null) {in.close (); di = null; }} catch (ioException e) {lempar SerialPortInputStreamCloseFailure baru (); }} return byte; } /*** Tambahkan pendengar* @param port port port objek* @param pendengar pendengar serial port* @throws Toomyylisteners Ada terlalu banyak objek kelas mendengarkan* /public static addlistener (serialport port, serialportEventener listener) leudeventerererer (cobalah {// addanportEventener listener) LROWSOMENTERED) (cobalah {// add listener porterer) leudeVentener (cobalah {// add listener porter) leudeVentener (cobalah {// add listener port. // atur untuk membangunkan utas penerima mendengarkan saat data tiba port.notifyondatavailable (true); // diatur untuk membangunkan utas interupsi ketika komunikasi terputus port.NotifyOnBreakInterrupt (true); } catch (TOOMANYLISTENERSEXCEPTION E) {lempar TOOMANYLISTENERS (); }}}Catatan: Pengecualian lemparan dalam metode ini adalah semua pengecualian khusus saya. Alasan untuk ini adalah untuk memfasilitasi pemrosesan yang sesuai dalam program utama. Berikut adalah deskripsi salah satu pengecualian:
(Perhatikan bahwa semua pengecualian khusus saya ditempatkan di paket SerialException)
Paket SerialException; Kelas Publik SerialportParameterFailure memperluas Exception { / ** * * / private static final long serialVersionuid = 1L; Public SerialPortParameterFailure () {} @Override Public String ToString () {return "Set parameter port serial gagal! Membuka operasi port serial tidak selesai!"; }}Saya telah menulis ulang metode tostring () untuk setiap kelas pengecualian khusus, sehingga program utama dapat mencetak pesan kesalahan yang sesuai setelah menangkap pengecualian.
Ada juga kelas dalam paket SerialException yang mengekstraksi informasi kesalahan dalam objek pengecualian yang diterima dan mengubahnya menjadi string dan mengembalikannya. Kodenya adalah sebagai berikut:
Paket SerialException; impor java.io.ioException; impor java.io.printwriter; import java.io.stringwriter;/*** bertanggung jawab untuk mengekstraksi dan mengonversi pesan kesalahan dalam pengecualian yang diteruskan menjadi string; * @Author Zhong * */Public Class ExceptionWriter {/** * Encapsulate pesan kesalahan dalam pengecualian ke dalam string dan kembalikan string * @param e berisi kesalahan pengecualian * @return kesalahan pesan string */string statis public getErrorInfofromexception (pengecualian e) {stringwriter sw = null; Printwriter pw = null; coba {sw = new stringwriter (); pw = printwriter baru (SW); E.PrintStackTrace (PW); return "/r/n" + sw.tostring () + "/r/n"; } catch (Exception e2) {return "Pesan kesalahan tidak diperoleh, silakan periksa dan coba lagi!"; } akhirnya {coba {if (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioException e1) {e1.printstacktrace (); }}}}Empat:
Penggunaan kelas program utama, Client.java berisi alamat entri program (metode utama). Fungsinya adalah untuk menampilkan antarmuka selamat datang dan memanggil kelas dataview.java untuk tampilan data port serial aktual.
Kode klien.java adalah sebagai berikut:
Paket Serialport; Impor Java.Awt.Color; Impor Java.Awt.Flowlayout; impor java.awt.font; import java.awt.frame; import java.awt.graphics; import java.awt.gridlayout; impor java.awt.image; impor java.awtellayout; impor java.awt.image; import java.awtellayout; impor java.awt.image; impor java.awtelawt; java. java.awt.toolkit; impor java.awt.event.keyadapter; impor java.awt.event.keyevent; impor java.awt.event.windowapter; impor java.awt.event.windowevent; impor javax.swing.joptionpane; Zhong * */Klien Kelas Publik Memperluas Frame {/** * */Private Static Final Long SerialVersionUid = 1L; / *** Lebar antarmuka program*/ Lebar int final statis publik = 800; / *** Tinggi Antarmuka Program*/ Tinggi Int Akhir Statis Publik = 620; / ** * Lokasi antarmuka program (koordinat horizontal) */ public static final int loc_x = 200; / ** * Lokasi antarmuka program (koordinat horizontal) */ public static final int loc_y = 70; Warna warna = warna.hite; Gambar offscreen = null; // Digunakan untuk buffering ganda // Atur ikon jendela (di sini saya menyesuaikan ikon ikon jendela jendela, karena saya benar-benar berpikir ikon kopi kecil mana yang tidak tampan = =) toolkit toolkit = getToolKit (); Image Icon = toolkit.getImage (client.class.getResource ("computer.png")); // Pegang kelas lain DataView DataView = DataView baru (this); // Kelas Antarmuka Utama (Menampilkan Panel Utama Data Pemantauan)/*** Metode Utama* @param args //*/public static void main (string [] args) {klien baru (). Launchframe (); } / *** Tampilkan antarmuka utama* / public void launchframe () {this.setBounds (loc_x, loc_y, lebar, tinggi); // Tetapkan lokasi di mana program muncul di desktop this.settitle ("Proyek CDIO"); // Tetapkan judul program this.seticonimage (ikon); this.setBackground (color.white); // Atur warna latar belakang this.addwindowlistener (windowAdapter baru () {// Tambahkan mendengarkan status jendela public void windowclosing (windowevent arg0) {//system.exit(0); // Keluar dari program}}); this.addeylistener (keymonitor baru ()); // tambahkan pendengar keyboard this.setriSizable (false); // Ukuran jendela tidak dapat diubah ini.setVisible (true); // jendela tampilan utas baru (repaintthread baru ()). Start (); // Utas pengecatan ulang}/*** Gambar berbagai elemen komponen antarmuka program*/public void cat (grafik g) {warna c = g.getColor (); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 40)); G.SetColor (Color.Black); G.DrawString ("Selamat datang menggunakan sistem pemantauan waktu nyata dari komputer atas", 45, 190); G.SetFont (font baru ("Microsoft Yahei", Font.italic, 26)); G.SetColor (Color.Black); G.DrawString ("Versi: 1.0 Didukung oleh: Zhonglei", 280, 260); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 30)); g.setColor (warna); g.drawString("―--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- = Color.white;} / *** Metode buffering ganda mengecat setiap komponen elemen dari antarmuka* / pembaruan public (grafik g) {if (offscreen == null) offscreen = this.createImage (width, tinggi); goffscreen.setcolor (color.white); Canvas asli} /** kelas dalam mengimplementasikan pemantauan peristiwa keyboard* / kelas private keymonitor memperluas keyAdapter {public void keyreleased (keyevent e) {int keycode = e.getKeyCode (); if (keycode == keyevent.vk_enter) {// Ketika monitor mendengar bahwa pengguna mengenai keyboard masukkan tombol, jalankan operasi berikut setVisible (false); // Sembunyikan Welcome Interface DataView.SetVisible (true); // tunjukkan antarmuka pemantauan dataview.dataframe (); // inisialisasi antarmuka pemantauan}}}/ * * mengecat ulang utas (mengecat ulang setiap 250 milidetik) */kelas privat melatih ulang implementasi runnable {public void run () {while (true) {caTiint (); coba {thread.sleep (250); } catch (InterruptedException e) {// Buat dialog ketika utas mengecat membuat pengecualian dan menampilkan detail pengecualian string err = exceptionWriter.getErrorInfofromexception (e); JOPTIONPANE.SHOWMESSADEIALOG (NULL, ERR, "ERROR", JOPTIONPANE.INFORMATION_MESSAGE); System.exit (0); }}}}}Menjalankan tangkapan layar:
CATATAN: Kunci "Klik Enter Bawah untuk memasukkan antarmuka utama" dalam proses operasi yang sebenarnya memiliki efek flash (dicapai dengan menggambar ulang antarmuka sesekali, memungkinkan kalimat ini muncul berulang kali dalam warna putih dan hitam). The double buffering method is conducive to solving the problem of flickering the interface when re-drawing (if you do not use the double buffering method, it is equivalent to drawing new things on the old interface bit by bit every time you re-draw, and double buffering is essentially by first drawing a new interface in memory, and then directly covering the old interface with the new interface at once)
Kode DataView.java adalah sebagai berikut: (Kelas ini digunakan untuk menampilkan data port serial secara real time)
Penjelasan Sederhana:
Perangkat perangkat keras mengirimkan data ke komputer melalui port serial sesekali. Setelah alat port serial berhasil terhubung ke perangkat perangkat keras dan menambahkan pemantauan, itu akan menguraikan data dan memperbarui antarmuka setiap kali data diterima;
Persyaratan Anda cenderung berbeda dari tambang saat menggunakannya. Kelas ini hanya untuk referensi. Dalam penggunaan aktual, Anda mungkin perlu membuat ulang antarmuka tampilan data dan metode analisis data.
Paket Serialport; Impor Java.Awt.Button; Impor Java.Awt.Choice; Impor Java.Awt.Color; Impor Java.awt.font; Impor Java.awt.frame; import java.awt.graphics; import java.awt.image; impor java.awt.awt.graphics; import java.awt.image; impor java.awt.awt.awt.graphics; impor java.awt.image; impor java.awt.awt.awt.graphics; Java. java.awt.event.actionevent; impor java.awt.event.actickener; impor java.awt.event.windowapter; impor java.awt.event.windowevent; impor java.util.list; impor java.util.toyylistenersception; gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import serialException.*;/** * Monitoring data display class* @author Zhong * */public class DataView extends Frame { /** * */ private static final long serialVersionUID = 1L; Klien Klien = NULL; Daftar Pribadi <String> CommList = NULL; // Simpan nomor port yang tersedia Serialport Serialport = NULL; // Simpan Objek Port Serial Private Font = Font baru ("Microsoft Yahei", Font.Bold, 25); label pribadi TEM = label baru ("No Data Yet", Label.Center); // suhu label pribadi hum = label baru ("no data belum", label.center); // kelembaban label pribadi pa = label baru ("no data belum", label.center); // tekan label pribadi hujan = label baru ("no data belum", label.center); // label privat curah hujan win_sp = label baru ("no data belum", label.center); // label privat kecepatan angin win_dir = label baru ("no data belum", label.center); // Wind Direction Private Choice CommChoice = New Choice (); // Serial Port Selection (drop-down box) Private Choice BPSCHOICE = Pilihan baru (); // Pilihan Buruk Tombol Pribadi OpenSerialButton = Tombol Baru ("Buka Port Serial"); Gambar offscreen = null; // Canvas saat mengecat ulang // atur ikon toolkit window toolkit = getToolKit (); Image icon = toolkit.getImage (dataview.class.getResource ("computer.png")); / *** class constructor* @param klien*/ public dataView (klien klien) {this.client = klien; commlist = serialtool.findport (); // Pindai port serial yang valid sekali ketika program diinisialisasi} /*** Jendela menu utama ditampilkan; * Tambahkan label, tombol, bilah drop-down dan mendengarkan acara terkait; */ public void dataFrame () {this.setBounds (client.loc_x, client.loc_y, client.width, client.height); this.settitle ("Proyek CDIO"); this.seticonimage (ikon); this.setBackground (color.white); this.setLayout (null); this.addwindowlistener (windowAdapter baru () {public void windowclosing (windowevent arg0) {if (serialport! = null) {// tutup port serial ketika program keluar dan melepaskan sumber daya serialtool.closeport (serialport);} system.exit (0);};}); tem.setbounds (140, 103, 225, 50); tem.setBackground (color.black); tem.setfont (font); tem.setForeground (color.hite); tambahkan (tem); hum.setbounds (520, 103, 225, 50); hum.setBackground (Color.black); hum.setfont (font); hum.setForeground (color.hite); tambahkan (hum); pa.setbounds (140, 193, 225, 50); pa.setBackground (color.black); pa.setfont (font); pa.setForeground (color.hite); tambahkan (pa); Rain.setbounds (520, 193, 225, 50); Rain.setBackground (Color.Black); rain.setfont (font); Rain.setForeground (Color.White); tambahkan (hujan); win_sp.setbounds (140, 283, 225, 50); win_sp.setBackground (Color.Black); win_sp.setfont (font); win_sp.setForeground (color.white); tambahkan (win_sp); win_dir.setbounds (520, 283, 225, 50); win_dir.setBackground (Color.Black); win_dir.setfont (font); win_dir.setForeground (color.white); tambahkan (win_dir); // Tambahkan opsi pemilihan port serial CommChoice.setbounds (160, 397, 200, 200); // Periksa apakah ada port serial yang tersedia. If (commlist == null || commlist.size () <1) {joptionpane.showmessagealog (null, "tidak ada port serial yang valid ditemukan!", "Kesalahan", joptionpane.information_message); } else {for (string s: commlist) {commchoice.add (s); }} add (commchoice); // Tambahkan opsi baud rate bpschoice.setbounds (526, 396, 200, 200); bpschoice.add ("1200"); bpschoice.add ("2400"); bpschoice.add ("4800"); bpschoice.add ("9600"); bpschoice.add ("14400"); bpschoice.add ("19200"); bpschoice.add ("115200"); tambahkan (bpschoice); // Tambahkan tombol Open Serial Port OpenSerialButton.setbounds (250, 490, 300, 50); OpenSerialButton.SetBackground (Color.LightGray); OpenSerialButton.setfont (font baru ("Microsoft Yahei", Font.Bold, 20)); OpenSerialButton.SetForeground (Color.DarkGray); Tambah (OpenSerialButton); // Tambahkan acara Mendengarkan untuk tombol Open Serial Port openSerialButton.AddactionListener (ActionListener baru () {public void actionPerformed (ActionEvent e) {// Dapatkan port serial string commname = commChoice.getSelectedItem (); // dapatkan string string sarung bpsstr = bpschoice. (commname == null || commname.equals ("")) {joptionpane.showmessagealog (null, "tidak ada port serial yang valid ditemukan!", "kesalahan", joptionpane.information_message); JOPTIONPANE.ShowMessageDialog (NULL, "BURUK TINGKAT DAPATKAN KESALAHAN!", "ERROR", JOPTIONPANE.Information_Message); Serialtool.openport (commname, bps); // Monitor diminta untuk berhasil memantau joptionpane.showmessagedialog (null, "Monitor berhasil, data pemantauan akan ditampilkan nanti!", "Prompt", joptionpane.information_message); } Catch (SerialportParameterFailure | notaserialport | nosuchport | portinuse | ToomaniListeners e1) {// Ketika kesalahan terjadi, gunakan dialog untuk meminta pesan kesalahan spesifik joptionpane.showmessageDialog (null, e1, "error", joptionpane.information_formation_formation_formsage (null); }}}}}}); this.setresizable (false); utas baru (baru repaintthread ()). start (); // Mulai utas mengecat}/*** Gambar elemen komponen antarmuka utama*/public void cat (grafik g) {color c = g.getColor (); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); g.drawstring ("suhu:", 45, 130); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Kelembaban:", 425, 130); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); g.drawstring ("tekanan:", 45, 220); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Hujan:", 425, 220); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Kecepatan Angin:", 45, 310); G.SetColor (Color.Black); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("arah angin:", 425, 310); g.setColor (color.gray); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Pemilihan Port Serial:", 45, 410); g.setColor (color.gray); G.SetFont (font baru ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Tingkat Buruk:", 425, 410); } / *** Metode buffering ganda mengecat ulang setiap komponen elemen dari antarmuka* / pembaruan public void (grafik g) {if (offscreen == null) offscreen = this.createImage (client.width, client.height); Grafik goffscreen = offscreen.getGraphics (); Warna c = goffscreen.getColor (); goffscreen.setColor (color.white); goffscreen.fillrect (0, 0, client.width, client.height); // cat ulang kanvas latar belakang this.paint (goffscreen); // mengecat ulang elemen antarmuka goffscreen.setColor (c); G.DrawImage (offscreen, 0, 0, null); // "Semprotkan" kanvas yang baru ditarik pada kanvas asli}/ * * utas mengecat ulang (mengecat ulang setiap 30 milidetik) */kelas privat Pencatatan ulang mengimplementasikan runnable {public void run () {while (true) {// Panggil metode mengecat ulang ulang (); // Pindai port serial yang tersedia commlist = serialtool.findport (); if (commlist! = null && comlist.size ()> 0) {// Tambahkan port serial yang tersedia baru untuk (string s: commlist) {// Apakah nama port serial sudah ada? Default awal tidak ada (jika ada di Commlist tetapi tidak ada di CommChoice, itu akan baru ditambahkan) boolean commexist = false; untuk (int i = 0; i <commchoice.getItemCount (); i ++) {if (s.equals (commchoice.getItem (i))) {// Nama port serial yang saat ini dipindai sudah ada di awal scan commexist = true; merusak; }} if (commexist) {// Nama port serial yang saat ini dipindai sudah ada di pemindaian awal, dan langsung memasuki loop berikutnya lanjutkan; } else {// Jika tidak ada, tambahkan nama port serial baru ke daftar drop-down port serial yang tersedia commchoice.add (s); }} // Hapus port serial yang sudah tidak tersedia untuk (int i = 0; i <commchoice.getitemCount (); i ++) {// Apakah port serial telah kedaluwarsa, default awal tidak valid (ada dalam commchoice tetapi tidak ada dalam daftar, telah dikembalikan) boolean commnotexist = true; true; true; true; untuk (string s: commlist) {if (s.equals (commchoice.getItem (i))) {commnotexist = false; merusak; }} if (commnotexist) {//system.out.println("remove " + commchoice.getItem (i)); commchoice.remove (i); } else {lanjutan; }}} else {// Jika commlist yang dipindai kosong, hapus semua port serial yang ada commchoice.removeall (); } coba {thread.sleep (30); } catch (InterruptedException e) {String err = ExceptionWriter.getErrorInfOfRomException (e); JOPTIONPANE.SHOWMESSADEIALOG (NULL, ERR, "ERROR", JOPTIONPANE.INFORMATION_MESSAGE); System.exit (0); }}}}} / *** Buat kelas mendengarkan serial dalam bentuk kelas internal* @author zhong** / kelas privat SeriAllistener mengimplementasikan SerialPortEventListener { / *** menangani acara port serial* / sakelar public. Serialportevent.bi: // 10 komunikasi interupsi joptionpane.showmessagedialog (null, "komunikasi interupsi dengan perangkat serial", "error", joptionpane.information_message); merusak; kasus serialportevent.oe: // 7 overflow (overflow) kesalahan kasus serialportevent.fe: // 9 frame error case SerialportEvent.pe: // 8 Parity error case SerialportEvent.cd: // 6 case deteksi serialportevent.cts: /3 data yang jelas untuk dikirimkan. 5 Ringing Menunjukkan kasus serialportEvent.output_buffer_empty: // 2 Buffer output telah dibersihkan; case SerialportEvent.data_available: // 1 Data yang tersedia ada di port serial // System.out.println ("Data yang Ditemukan"); byte [] data = null; coba {if (serialport == null) {joptionpane.showmessagealog (null, "objek port serial kosong! Pemantauan gagal!", "error", joptionpane.information_message); } else {data = serialtool.readfromport (serialport); // Baca data dan simpan di array byte // system.out.println (string baru (data)); // Kustomisasi proses parsing, Anda dapat menguraikan data setelah menerima data sesuai dengan kebutuhan Anda sendiri selama proses penggunaan aktual jika (data == null || data.length <1) {// Periksa apakah data dibaca dengan benar joptionpane.showmessageDialog (null, "tidak ada data yang valid yang diperoleh selama pembacaan data! Harap periksa program atau perangkat ini atau salah dengan program atau program ini!" Joptionpane.information_message); System.exit (0); } else {string dataoriginal = string baru (data); // Konversi data array byte ke string yang menyimpan string data asli DataValid = ""; // Data yang valid (digunakan untuk menyimpan string data asli dan menghapus string setelah angka awal *) string [] elemen = null; // Digunakan untuk menyimpan array string yang diperoleh setelah membelah string asli dengan spasi // parsing data if (dataoriginal.charat (0) == ' *') {// Ketika karakter pertama dari data adalah * angka, itu berarti bahwa penerimaan data selesai, dan parsing datavalid = dataoriginal.substring (1); elemen = datavalid.split (""); if (elemen == null || elemen.length <1) {// Periksa apakah data diuraikan dengan benar joptionpane.showmessageDialog (null, "ada kesalahan dalam proses parsing data, silakan periksa perangkat atau program!", "Kesalahan", joptionpane.information_message); " System.exit (0); } else {coba {// perbarui nilai label antarmuka/*untuk (int i = 0; i <elements.length; i ++) {System.out.println (elemen [i]); }*///System.out.println("win_dir: " + elemen [5]); tem.setText (elemen [0] + "℃"); hum.setText (elemen [1] + " %"); pa.setText (elemen [2] + "hpa"); rain.setText (elemen [3] + "mm"); win_sp.setText (elemen [4] + "m/s"); win_dir.setText (elemen [5] + "°"); } catch (arrayIndExoutOfBoundSException e) {jOptionPane.showmessageDialog (null, "Proses analisis data memiliki kesalahan, dan data antarmuka pembaruan gagal! Harap periksa perangkat atau program!", "Kesalahan", joptionpane.information_message); " System.exit (0); }}}}}}} catch (readDataFromserialportFailure | serialportInputStreamCloseFailure e) {jOptionPane.showmessageDialog (null, "error", joptionpane.information_message); System.exit (0); // Keluar dari sistem setelah pesan kesalahan ditampilkan saat kesalahan baca terjadi} break; }}}}Menjalankan tangkapan layar:
Unduh seluruh kode sumber proyek: http://xiazai.vevb.com/201612/yuanma/javaserialmonitorik(vevb.com).rar
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.