หลักสูตรล่าสุดต้องมีการเขียนเครื่องมือการสื่อสารแบบอนุกรมสำหรับคอมพิวเตอร์ส่วนบน ฉันเขียนเครื่องมือการสื่อสารแบบอนุกรมอย่างง่ายด้วยอินเทอร์เฟซกราฟิกตาม Java กระบวนการจะอธิบายในรายละเอียดด้านล่างสำหรับการอ้างอิงของคุณ^_^
หนึ่ง:
ก่อนอื่นคุณต้องดาวน์โหลดแพ็คเกจ JAR เพิ่มเติมที่รองรับการทำงานการสื่อสารของ Java Serial Port เนื่องจาก Java.Comm ค่อนข้างเก่าและไม่รองรับระบบ 64 บิตจึงขอแนะนำให้แพ็คเกจ RXTX JAR (ทั้งการสนับสนุน 32 บิต/64 บิต)
ที่อยู่ดาวน์โหลดอย่างเป็นทางการ: http://fizzed.com/oss/rxtx-for-java (หมายเหตุ: FQ อาจต้องดาวน์โหลด)
รองเท้าเด็กที่ไม่สามารถดาวน์โหลด FQ ได้ที่นี่:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32-bit)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64-bit)
สอง:
ดาวน์โหลดแพ็คเกจ JAR ที่รันซิปและแนะนำภายใต้ Java Build Path:
การจับกุม
หมายเหตุ: หากข้อผิดพลาด java.lang.unsatisfiedlinkerror ถูกโยนลงระหว่างการดำเนินการโปรดคัดลอกไฟล์สองไฟล์ของ rxtxparallel.dll และ rxtxserial.dll ในแพ็คเกจการบีบอัด RXTX ไปยังไดเรกทอรี C:/Windows/System32 เพื่อแก้ไขข้อผิดพลาด
สาม:
เกี่ยวกับการใช้แพ็คเกจ JAR นี้ฉันเขียนคลาส serialtool.java ซึ่งให้บริการง่าย ๆ ที่หลากหลายสำหรับการสื่อสารพอร์ตอนุกรม รหัสมีดังนี้ (โปรดทราบว่าคลาสนี้อยู่ในแพ็คเกจ serialport):
แพ็คเกจ serialport; นำเข้า java.io.ioexception; นำเข้า java.io.inputstream; นำเข้า java.io.Outputstream; นำเข้า java.util.arraylist; นำเข้า java.util.enumeration; นำเข้า java.util.toomanylistenersexception; gnu.io.nosuchportexception; นำเข้า gnu.io.portinuseexception; นำเข้า gnu.io.serialport; นำเข้า gnu.io.serialporteventListener; นำเข้า Gnu.io.unsupportedComentComentException; (ใช้โหมดการออกแบบซิงเกิลตัน) * @author zhong * */คลาสสาธารณะ serialtool {ส่วนตัว serialtool serialtool = null; คงที่ {// เริ่มต้นวัตถุ serialTool เมื่อคลาสนี้โหลดโดย classloader ถ้า (serialTool == null) {serialTool = new serialTool (); }} // ตัวสร้างของคลาส serialtool ส่วนตัวไม่ได้รับอนุญาตให้สร้างวัตถุ serialtool ส่วนตัว serialtool () {} /*** รับวัตถุ serialtool ที่ให้บริการ* @return serialtool* /serialtool serialtool } return serialtool; } /*** ค้นหาพอร์ตที่มีอยู่ทั้งหมด* @return รายการชื่อพอร์ตที่มีอยู่* /Public Static Final ArrayList <String> findport () {// รับพอร์ตอนุกรมการแจกแจงทั้งหมดที่มีอยู่ในปัจจุบัน ArrayList <String> portnamelist = new ArrayList <> (); // เพิ่มชื่อพอร์ตอนุกรมที่มีอยู่ในรายการและส่งคืนรายการในขณะที่ (portlist.hasmoreElements ()) {สตริงพอร์ต name = portlist.nextelement (). getName (); portnamelist.add (Portname); } ส่งคืน portnamelist; } /*** เปิดพอร์ตอนุกรม* @param ชื่อพอร์ตชื่อพอร์ต* @param baudrate baudrate* @return วัตถุ serialport* @throws serialportparameterfailure ล้มเหลวในการตั้งค่าพารามิเตอร์พอร์ตอนุกรม* @throws notaserialport พอร์ตที่ชี้ไปที่อุปกรณ์ ครอบครอง*/สาธารณะคงที่ serialport final openport (สตริงพอร์ต, int baudrate) พ่น serialparameterfailure, notaserialport, nosuchport, portinuse {ลอง {// ระบุพอร์ตโดยชื่อพอร์ต portidentifier portidentifier = postportidentifier // เปิดพอร์ตและให้ชื่อพอร์ตและการหมดเวลา (เวลาหมดเวลาในการเปิดการดำเนินการ) Commport Commport = portidentifier.open (Portname, 2000); // ปกป้องว่ามันเป็นพอร์ตอนุกรมหรือไม่ (Commport Instanceof serialport) {serialport serialport = (serialport) Commport; ลอง {// ตั้งค่าอัตราการรับส่งข้อมูลและพารามิเตอร์อื่น ๆ ของพอร์ตอนุกรม serialport.setserialportparams (baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (unsupportedCommoperationException e) {โยน serialportparameterfailure ใหม่ (); } //system.out.println("open " + portname +" sucessly! "); คืนอนุกรม; } else {// ไม่ใช่พอร์ตอนุกรมโยน notaserialport ใหม่ (); }} catch (nosuchportexception e1) {โยน nosuchport ใหม่ (); } catch (portinuseException e2) {โยน portinuse ใหม่ (); }} / *** ปิดพอร์ตอนุกรม* @param serialport วัตถุพอร์ตอนุกรมที่จะปิด* / โมฆะคงที่สาธารณะ closeport (serialport serialport) {ถ้า (serialport! = null) {serialport.close (); serialport = null; }} / *** ส่งข้อมูลไปยังพอร์ตอนุกรม* @param serialport serialport Object* @param ข้อมูลคำสั่งซื้อที่จะส่ง* @throws senddatoSerialportfailure ล้มเหลวในการส่งข้อมูลไปยังพอร์ตอนุกรม* @throws serialportputputstreamclosefailure SendDatoSerialPortFailure, serialportoutputStreamClosefailure {outputStream out = null; ลอง {out = serialport.getOutputStream (); out.write (คำสั่งซื้อ); out.flush (); } catch (ioexception e) {โยน senddatatoserialportfailure ใหม่ (); } ในที่สุด {ลอง {ถ้า (ออก! = null) {out.close (); ออก = null; }} catch (ioexception e) {โยน serialportoutputstreamclosefailure ใหม่ (); }}} / *** อ่านข้อมูลจากพอร์ตอนุกรม* @param serialport วัตถุ serialport ที่มีการเชื่อมต่อได้รับการสร้างขึ้น* @return ข้อมูลอ่าน* @throws readdataFromserialportfailure เกิดข้อผิดพลาดในขณะที่อ่านข้อมูลจากพอร์ต provalport ReadDataFromeserialPortFailure, serialportInputStreamClosefailure {inputStream ใน = null; ไบต์ [] ไบต์ = null; ลอง {in = serialport.getInputStream (); int bufflenth = in.available (); // รับความยาวข้อมูลในบัฟเฟอร์ในขณะที่ (bufflenth! = 0) {bytes = byte ใหม่ [bufflenth]; // เริ่มต้นอาร์เรย์ไบต์ให้กับความยาวของข้อมูลในบัฟเฟอร์ in.read (ไบต์); bufflenth = in.available (); }} catch (ioexception e) {โยน readdataFromserialportFailure ใหม่ (); } ในที่สุด {ลอง {ถ้า (ใน! = null) {in.close (); ใน = null; }} catch (ioexception e) {โยน serialportinputstreamclosefailure ใหม่ (); }} ส่งคืนไบต์; } /*** เพิ่มผู้ฟัง* @param พอร์ตพอร์ตพอร์ตวัตถุ* @param Listener พอร์ตอนุกรมผู้ฟัง* @throws toomanylisteners มีวัตถุการฟังจำนวนมากเกินไป* /โมฆะคงที่สาธารณะ // ตั้งค่าให้ปลุกเธรดการรับฟังเมื่อข้อมูลมาถึงพอร์ต Notifyondataavailable (จริง); // ตั้งค่าให้ปลุกเธรดอินเตอร์รัปต์เมื่อการสื่อสารถูกขัดจังหวะพอร์ต NotifyonBreakInterrupt (จริง); } catch (toomanylistenersexception e) {โยน toomanylisteners ใหม่ (); -หมายเหตุ: ข้อยกเว้นการโยนในวิธีนี้เป็นข้อยกเว้นที่กำหนดเองทั้งหมดของฉัน เหตุผลนี้คือการอำนวยความสะดวกในการประมวลผลที่สอดคล้องกันในโปรแกรมหลัก นี่คือคำอธิบายของข้อยกเว้นอย่างใดอย่างหนึ่ง:
(โปรดทราบว่าข้อยกเว้นที่กำหนดเองทั้งหมดของฉันถูกวางไว้ในแพ็คเกจ SerialException)
Package SerialException; Public Class SerialParameterFailure ขยายข้อยกเว้น { / ** * * / ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = 1L; public serialportParameterfailure () {} @Override สตริงสาธารณะ toString () {return "set พารามิเตอร์พอร์ตอนุกรมล้มเหลว! การเปิดการดำเนินการพอร์ตอนุกรมยังไม่เสร็จสมบูรณ์!"; -ฉันได้เขียนเมธอด ToString () ใหม่สำหรับแต่ละคลาสข้อยกเว้นที่กำหนดเองเพื่อให้โปรแกรมหลักสามารถพิมพ์ข้อความแสดงข้อผิดพลาดที่เกี่ยวข้องหลังจากจับข้อยกเว้น
นอกจากนี้ยังมีคลาสในแพ็คเกจ SerialException ที่แยกข้อมูลข้อผิดพลาดในวัตถุข้อยกเว้นที่ได้รับและแปลงเป็นสตริงและส่งคืน รหัสมีดังนี้:
แพ็คเกจ SerialException; นำเข้า java.io.ioException; นำเข้า java.io.printwriter; นำเข้า java.io.stringwriter;/*** รับผิดชอบในการแยกและแปลงข้อความแสดงข้อผิดพลาดในข้อยกเว้นที่ส่งไปเป็นสตริง; * @author Zhong * */Public Class ExceptionWriter {/** * ห่อหุ้มข้อความแสดงข้อผิดพลาดในข้อยกเว้นในสตริงและส่งคืนสตริง * @param e มีข้อผิดพลาดข้อผิดพลาด * @return ข้อความแสดงข้อผิดพลาดสตริง */สตริงคงที่ PrintWriter PW = NULL; ลอง {sw = new StringWriter (); PW = New PrintWriter (SW); E.PrintStackTrace (PW); ส่งคืน "/r/n" + sw.toString () + "/r/n"; } catch (Exception e2) {return "ข้อความแสดงข้อผิดพลาดไม่ได้รับโปรดตรวจสอบและลองอีกครั้ง!"; } ในที่สุด {ลอง {ถ้า (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioexception e1) {e1.printstacktrace (); -สี่:
การใช้คลาสโปรแกรมหลัก client.java ประกอบด้วยที่อยู่รายการของโปรแกรม (วิธีการหลัก) ฟังก์ชั่นของมันคือการแสดงอินเตอร์เฟสต้อนรับและเรียกคลาส dataview.java สำหรับการแสดงข้อมูลพอร์ตอนุกรมจริง
client.java รหัสมีดังนี้:
แพ็คเกจ serialport; นำเข้า java.awt.color; นำเข้า java.awt.flowlayout; นำเข้า java.awt.font; นำเข้า java.awt.frame; นำเข้า java.awt.graphics; นำเข้า Java.awt.gridlayout; java.awt.toolkit; นำเข้า java.awt.event.keyadapter; นำเข้า java.awt.event.keyEvent; นำเข้า java.awt.event.windowadapter; นำเข้า java.awt.event.windowevent; * */ไคลเอนต์คลาสสาธารณะขยายเฟรม {/** * */ส่วนตัวคงที่สุดท้ายสุดท้าย serialVersionUID = 1L; / *** ความกว้างของอินเทอร์เฟซโปรแกรม*/ ความกว้าง int สุดท้ายคงที่สาธารณะ = 800; / *** ความสูงของโปรแกรมอินเทอร์เฟซ*/ สาธารณะคงที่ความสูง int สุดท้าย = 620; / ** * ที่ตั้งของอินเทอร์เฟซโปรแกรม (พิกัดแนวนอน) */ สาธารณะคงที่สาธารณะสุดท้าย loc_x = 200; / ** * ตำแหน่งของอินเทอร์เฟซโปรแกรม (พิกัดแนวนอน) */ สาธารณะคงที่สุดท้าย int loc_y = 70; สีสี = สีขาว; ภาพนอกจอ = null; // ใช้สำหรับการบัฟเฟอร์สองครั้ง // ตั้งค่าไอคอนของหน้าต่าง (ที่นี่ฉันปรับแต่งไอคอนไอคอนของหน้าต่างหน้าต่างเพราะฉันคิดว่าไอคอนกาแฟขนาดเล็กตัวไหนดูไม่ดี = =) เครื่องมือเครื่องมือ = getToolkit (); Image Icon = Toolkit.getImage (client.class.getResource ("Computer.png")); // ถือคลาสอื่น ๆ dataView dataView = ใหม่ dataview (นี่); // คลาสอินเตอร์เฟสหลัก (แสดงข้อมูลการตรวจสอบแผงหลัก)/*** วิธีหลัก* @param args //*/โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ไคลเอนต์ใหม่ (). launchframe (); } / *** แสดงอินเตอร์เฟสหลัก* / โมฆะสาธารณะ LaunchFrame () {this.setBounds (loc_x, loc_y, ความกว้าง, ความสูง); // ตั้งค่าตำแหน่งที่โปรแกรมปรากฏบนเดสก์ท็อป this.settitle ("CDIO Project"); // ตั้งชื่อโปรแกรม this.seticonimage (ไอคอน); this.setbackground (color.white); // ตั้งค่าสีพื้นหลัง this.addwindowListener (windowadapter ใหม่ () {// เพิ่มการฟังสถานะหน้าต่างเป็นโมฆะสาธารณะ windowclosing (windowevent arg0) {//system.exit(0); // ออกจากโปรแกรม}}); this.addkeyListener (Keymonitor ใหม่ ()); // เพิ่มคีย์บอร์ดฟัง this.setResizable (เท็จ); // ขนาดหน้าต่างไม่สามารถเปลี่ยนได้สิ่งนี้สามารถมองเห็นได้ (จริง); // หน้าต่างการแสดงผลเธรดใหม่ (ใหม่ repainthread ()). start (); // เธรด repaint}/*** วาดองค์ประกอบองค์ประกอบต่าง ๆ ของอินเตอร์เฟสโปรแกรม*/สีโมฆะสาธารณะ (กราฟิก g) {color c = g.getColor (); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 40)); G.SetColor (color.black); G.DrawString ("ยินดีต้อนรับที่จะใช้ระบบตรวจสอบแบบเรียลไทม์ของคอมพิวเตอร์ส่วนบน", 45, 190); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.italic, 26)); G.SetColor (color.black); G.DrawString ("เวอร์ชัน: 1.0 ขับเคลื่อนโดย: Zhonglei", 280, 260); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.bold, 30)); G.SetColor (สี); G.DrawString ("―---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- สีขาว; Goffscreen.SetColor (สีขาว); ผืนผ้าใบต้นฉบับ} /** คลาสภายในใช้การตรวจสอบเหตุการณ์แป้นพิมพ์* / Keymonitor คลาสส่วนตัวขยาย KeyAdapter {Public Void Keylelease (KeyEvent E) {int keycode = E.getKeyCode (); if (keycode == keyeVent.vk_enter) {// เมื่อจอภาพได้ยินว่าผู้ใช้กดปุ่มป้อนคีย์บอร์ดให้เรียกใช้งานการดำเนินการต่อไปนี้ setVisiable (เท็จ); // ซ่อนอินเตอร์เฟสต้อนรับ dataview.setVisible (จริง); // แสดงอินเตอร์เฟสการตรวจสอบ dataview.dataframe (); // เริ่มต้นอินเทอร์เฟซการตรวจสอบ}}}/ * * repaint เธรด (ทาสีใหม่ทุก ๆ 250 มิลลิวินาที) */คลาสส่วนตัว repainthread enprennable runnable {public void run () {ในขณะที่ (จริง) {repaint (); ลอง {thread.sleep (250); } catch (interruptedException e) {// สร้างกล่องโต้ตอบเมื่อเธรด repaint โยนข้อยกเว้นและแสดงรายละเอียดข้อยกเว้นสตริง ERR = ExceptionWriter.GetERRORINFOFROMEXSPECT (E); joptionpane.showmessagedialog (null, err, "ข้อผิดพลาด", joptionpane.information_message); System.Exit (0); -กำลังใช้งานภาพหน้าจอ:
หมายเหตุ: ด้านล่าง "คลิกปุ่ม Enter เพื่อเข้าสู่อินเทอร์เฟซหลัก" ในกระบวนการดำเนินการจริงมีเอฟเฟกต์แฟลช (ทำได้โดยการวาดอินเทอร์เฟซอีกครั้งทุกครั้งในขณะที่ทำให้ประโยคนี้ปรากฏซ้ำ ๆ ในสีขาวและสีดำ) วิธีการบัฟเฟอร์สองครั้งนั้นเอื้อต่อการแก้ปัญหาการกะพริบของอินเทอร์เฟซเมื่อวาดอีกครั้ง (ถ้าคุณไม่ใช้วิธีการบัฟเฟอร์คู่มันก็เทียบเท่ากับการวาดสิ่งใหม่ ๆ บนอินเทอร์เฟซเก่าทีละบิตทุกครั้งที่คุณวาดใหม่และการบัฟเฟอร์สองครั้ง
รหัส dataview.java มีดังนี้: (คลาสนี้ใช้เพื่อแสดงข้อมูลพอร์ตอนุกรมแบบเรียลไทม์)
คำอธิบายง่ายๆ:
อุปกรณ์ฮาร์ดแวร์ส่งข้อมูลไปยังคอมพิวเตอร์ผ่านพอร์ตอนุกรมทุกครั้ง หลังจากเครื่องมือพอร์ตอนุกรมเชื่อมต่อกับอุปกรณ์ฮาร์ดแวร์ได้สำเร็จและเพิ่มการตรวจสอบมันจะแยกวิเคราะห์ข้อมูลและอัปเดตอินเทอร์เฟซทุกครั้งที่ได้รับข้อมูล
ความต้องการของคุณมีแนวโน้มที่จะแตกต่างจากของฉันเมื่อใช้งาน คลาสนี้ใช้สำหรับการอ้างอิงเท่านั้น ในการใช้งานจริงคุณอาจต้องสร้างอินเทอร์เฟซการแสดงข้อมูลและวิธีการวิเคราะห์ข้อมูลใหม่
แพ็คเกจ serialport; นำเข้า java.awt.button; นำเข้า java.awt.choice; นำเข้า java.awt.color; นำเข้า java.awt.font; นำเข้า java.awt.frame; นำเข้า java.awt.graphics; นำเข้า Java.awt.image; java.awt.event.actionevent; นำเข้า java.awt.event.actionListener นำเข้า java.awt.event.windowadapter; นำเข้า java.awt.event.windowevent; นำเข้า java.util.list; gnu.io.serialport; นำเข้า gnu.io.serialportevent; นำเข้า gnu.io.serialporteventListener; นำเข้า serialexception.*;/*** การตรวจสอบข้อมูลการแสดงข้อมูล* @author zhong**/ชั้นเรียนสาธารณะ ไคลเอนต์ไคลเอนต์ = null; รายการส่วนตัว <String> commlist = null; // บันทึกหมายเลขพอร์ตที่มีอยู่อนุกรม serialport ส่วนตัว = null; // บันทึกพอร์ตอนุกรมวัตถุฟอนต์ตัวอักษรส่วนตัว = ตัวอักษรใหม่ ("Microsoft Yahei", Font.bold, 25); ฉลากส่วนตัว TEM = ฉลากใหม่ ("ยังไม่มีข้อมูล", label.center); // อุณหภูมิส่วนตัวฉลาก hum = ฉลากใหม่ ("ยังไม่มีข้อมูล", label.center); // ความชื้นส่วนตัวฉลาก PA = ฉลากใหม่ ("ยังไม่มีข้อมูล", label.center); // ความดันฉลากส่วนตัว Rain = ฉลากใหม่ ("ยังไม่มีข้อมูล", label.center); // ฉลากส่วนตัวปริมาณน้ำฝน win_sp = ฉลากใหม่ ("ยังไม่มีข้อมูล", label.center); // Wind Speed Private Label win_dir = ใหม่ฉลาก ("ยังไม่มีข้อมูล", label.center); // ทิศทางลมตัวเลือกส่วนตัว commchoice = ตัวเลือกใหม่ (); // การเลือกพอร์ตอนุกรม (กล่องแบบเลื่อนลง) ตัวเลือกส่วนตัว bpsChoice = ตัวเลือกใหม่ (); // การเลือกอัตราที่ไม่ดีปุ่มส่วนตัว OpenSerialButton = ปุ่มใหม่ ("เปิดพอร์ตอนุกรม"); ภาพนอกจอ = null; // Canvas เมื่อทาสีใหม่ // ตั้งค่าไอคอนของเครื่องมือเครื่องมือหน้าต่างเครื่องมือ = getToolKit (); Image Icon = toolkit.getImage (dataview.class.getResource ("Computer.png")); / *** class constructor* @param client*/ public dataview (ไคลเอนต์ไคลเอนต์) {this.client = client; commlist = serialtool.findport (); // สแกนพอร์ตอนุกรมที่ถูกต้องหนึ่งครั้งเมื่อโปรแกรมเริ่มต้น} /*** หน้าต่างเมนูหลักจะปรากฏขึ้น * เพิ่มป้ายกำกับ, ปุ่ม, แถบดรอปดาวน์และการฟังเหตุการณ์ที่เกี่ยวข้อง; */ โมฆะสาธารณะ dataFrame () {this.setBounds (client.loc_x, client.loc_y, client.width, client.height); this.settitle ("CDIO Project"); this.seticonimage (ไอคอน); this.setbackground (color.white); this.setLayout (NULL); this.addwindowListener (ใหม่ windowadapter () {โมฆะสาธารณะ windowclosing (windowevent arg0) {ถ้า (serialport! = null) {// ปิดพอร์ตอนุกรมเมื่อโปรแกรมออกและปล่อยทรัพยากร serialtool.closeport (serialport);} system.exit (0);};}; Tem.SetBounds (140, 103, 225, 50); Tem.SetBackground (color.black); Tem.SetFont (แบบอักษร); Tem.Setforeground (สีขาว); เพิ่ม (TEM); hum.setbounds (520, 103, 225, 50); hum.setbackground (color.black); hum.setfont (แบบอักษร); hum.setforeground (สีขาว); เพิ่ม (ฮัม); Pa.setbounds (140, 193, 225, 50); pa.setbackground (color.black); Pa.setFont (แบบอักษร); Pa.setforeground (สีขาว); เพิ่ม (PA); Rain.setbounds (520, 193, 225, 50); Rain.setbackground (color.black); RAIN.SESTFONT (แบบอักษร); Rain.setforeground (สีขาว); เพิ่ม (ฝน); win_sp.setbounds (140, 283, 225, 50); win_sp.setbackground (color.black); win_sp.setfont (แบบอักษร); win_sp.setforeground (color.white); เพิ่ม (win_sp); win_dir.setbounds (520, 283, 225, 50); win_dir.setbackground (color.black); win_dir.setfont (แบบอักษร); win_dir.setforeground (color.white); เพิ่ม (win_dir); // เพิ่มตัวเลือกการเลือกพอร์ตอนุกรม commchoice.setbounds (160, 397, 200, 200); // ตรวจสอบว่ามีพอร์ตอนุกรมหรือไม่ if (commlist == null || commlist.size () <1) {joptionpane.showmessagedialog (null, "ไม่พบพอร์ตอนุกรมที่ถูกต้อง!", "ข้อผิดพลาด", joptionpane.information_message); } else {สำหรับ (String s: commlist) {commchoice.add (s); }} เพิ่ม (commchoice); // เพิ่มตัวเลือกอัตราการรับส่ง 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"); เพิ่ม (bpschoice); // เพิ่มปุ่ม Open Port Port OpenSerialButton.SetBounds (250, 490, 300, 50); OpenSerialButton.SetBackground (Color.LightGray); OpenSerialButton.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.bold, 20)); OpenSerialButton.SetForeground (Color.darkgray); เพิ่ม (OpenSerialButton); // เพิ่มการฟังเหตุการณ์สำหรับปุ่มเปิดพอร์ตอนุกรม OpenSerialButton.addActionListener (ใหม่ actionListener () {โมฆะสาธารณะ actionperformed (actionEvent e) {// รับสตริงชื่อพอร์ต serial name = commchoice.getSelectedItem () (commname == null || commname.equals ("")) {joptionpane.showmessagedialog (null, "ไม่พบพอร์ตอนุกรมที่ถูกต้อง!", "ข้อผิดพลาด", joptionpane.information_message); joptionpane.ShowMessagedialog (null, "อัตราที่ไม่ดีได้รับข้อผิดพลาด!", "ข้อผิดพลาด", joptionpane.information_message); serialtool.openport (commname, bps); // จอภาพได้รับแจ้งสำหรับการตรวจสอบที่ประสบความสำเร็จ joptionpane.ShowMessageDialog (null, "จอภาพประสบความสำเร็จข้อมูลการตรวจสอบจะปรากฏในภายหลัง!", "พรอมต์", joptionpane.information_message); } catch (serialportparameterfailure | notaserialport | nosuchport | portinuse | toomanylisteners e1) {// เมื่อเกิดข้อผิดพลาดให้ใช้กล่องโต้ตอบเพื่อแจ้งข้อความแสดงข้อผิดพลาดเฉพาะ joptionpane - this.setResizable (เท็จ); เธรดใหม่ (ใหม่ repainthread ()). start (); // เริ่มเธรด repaint}/*** วาดองค์ประกอบส่วนประกอบอินเตอร์เฟสหลัก*/สีโมฆะสาธารณะ (กราฟิก g) {color c = g.getColor (); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("อุณหภูมิ:", 45, 130); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("ความชื้น:", 425, 130); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("ความดัน:", 45, 220); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("ฝน:", 425, 220); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("ความเร็วลม:", 45, 310); G.SetColor (color.black); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("ทิศทางลม:", 425, 310); G.SetColor (color.gray); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("การเลือกพอร์ตอนุกรม:", 45, 410); G.SetColor (color.gray); G.SetFont (ฟอนต์ใหม่ ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("อัตราที่ไม่ดี:", 425, 410); } / *** วิธีการบัฟเฟอร์สองครั้ง repaints แต่ละองค์ประกอบองค์ประกอบของอินเตอร์เฟส* / การอัปเดตโมฆะสาธารณะ (กราฟิก g) {ถ้า (นอกจอ == null) Offscreen = this.createImage (client.width, client.height); กราฟิก goffscreen = Offscreen.getGraphics (); สี c = goffscreen.getColor (); goffscreen.setColor (color.white); goffscreen.fillrect (0, 0, client.width, client.height); // ทาสีพื้นหลังผืนผ้าใบ this.paint (Goffscreen); // repaint องค์ประกอบอินเตอร์เฟส goffscreen.setColor (c); G.DrawImage (Offscreen, 0, 0, Null); // "สเปรย์" ผืนผ้าใบที่วาดใหม่บนผืนผ้าใบต้นฉบับ}/ * * repaint เธรด (ทาสีใหม่ทุก ๆ 30 มิลลิวินาที) */คลาสส่วนตัว repainthread enpaintements {public void run () {ในขณะที่ (จริง) {// เรียกวิธีการทาสีใหม่ (); // สแกนพอร์ตอนุกรมที่มีอยู่ commlist = serialtool.findport (); if (commlist! = null && commlist.size ()> 0) {// เพิ่มพอร์ตอนุกรมที่มีการสแกนใหม่สำหรับ (String s: commlist) {// ชื่อพอร์ตอนุกรมมีอยู่แล้วหรือไม่? ค่าเริ่มต้นเริ่มต้นไม่มีอยู่ (ถ้ามีอยู่ใน commlist แต่ไม่มีอยู่ใน commchoice มันจะถูกเพิ่มใหม่) boolean Commexist = false; สำหรับ (int i = 0; i <commchoice.getItemCount (); i ++) {ถ้า (s.equals (commchoice.getItem (i))) {// ชื่อพอร์ตอนุกรมที่สแกนอยู่ในปัจจุบันมีอยู่แล้ว หยุดพัก; }} if (Commexist) {// ชื่อพอร์ตอนุกรมที่สแกนอยู่ในปัจจุบันมีอยู่แล้วในการสแกนเริ่มต้นและเข้าสู่ลูปถัดไปโดยตรงต่อไป; } else {// หากไม่มีอยู่ให้เพิ่มชื่อพอร์ตอนุกรมใหม่ลงในรายการดรอปดาวน์พอร์ตอนุกรมที่มีอยู่ commchoice.add (s); }} // ลบพอร์ตอนุกรมที่ไม่สามารถใช้งานได้สำหรับ (int i = 0; i <commchoice.getItemCount (); i ++) {// ว่าพอร์ตอนุกรมได้หมดอายุค่าเริ่มต้นเริ่มต้นนั้นไม่ถูกต้อง สำหรับ (String s: commlist) {ถ้า (s.equals (commchoice.getItem (i))) {commnotexist = false; หยุดพัก; }} if (commnotexist) {//system.out.println("Remove " + commchoice.getItem (i)); commchoice.remove (i); } else {ดำเนินการต่อ; }}} else {// ถ้า commlist ที่สแกนว่างเปล่าลบพอร์ตอนุกรมที่มีอยู่ทั้งหมด commchoice.removeall (); } ลอง {thread.sleep (30); } catch (interruptedException e) {string err = exceptionwriter.geterrorinfofromexception (e); joptionpane.showmessagedialog (null, err, "ข้อผิดพลาด", joptionpane.information_message); System.Exit (0); }}}}} / *** สร้างคลาสการฟังแบบอนุกรมในรูปแบบของคลาสภายใน* @author zhong** / คลาสส่วนตัว seriallistener ใช้ serialporteventListener { / *** จัดการเหตุการณ์พอร์ตอนุกรม serialportevent.bi: // 10 การสื่อสารขัดจังหวะ joptionpane.showmessagedialog (null, "การสื่อสารขัดจังหวะด้วยอุปกรณ์อนุกรม", "ข้อผิดพลาด", joptionpane.information_message); หยุดพัก; case serialportevent.oe: // 7 overflow (ล้น) ข้อผิดพลาดกรณี case case serialportevent.fe: // 9 ข้อผิดพลาดเฟรมกรณี case case case serialportevent.pe: // 8 ข้อผิดพลาด parity case case serialportevent.cd: // 6 การตรวจจับผู้ให้บริการ case serialportevent.cts: // 3 ข้อมูลที่ชัดเจน // 5 RINGING หมายถึง case serialportevent.Output_buffer_empty: // 2 บัฟเฟอร์เอาต์พุตได้รับการล้าง case serialportevent.data_available: // 1 ข้อมูลที่มีอยู่ในพอร์ตอนุกรม // system.out.println ("พบข้อมูล"); ไบต์ [] data = null; ลอง {ถ้า (serialport == null) {joptionpane.showMessageDialog (null, "วัตถุพอร์ตอนุกรมว่างเปล่า! การตรวจสอบล้มเหลว!", "ข้อผิดพลาด", joptionpane.information_message); } else {data = serialTool.readFromport (serialport); // อ่านข้อมูลและจัดเก็บในอาร์เรย์ไบต์ // system.out.println (สตริงใหม่ (ข้อมูล)); // ปรับแต่งกระบวนการแยกวิเคราะห์คุณสามารถแยกวิเคราะห์ข้อมูลหลังจากได้รับข้อมูลตามความต้องการของคุณเองในระหว่างกระบวนการใช้งานจริงถ้า (data == null || data.length <1) {// ตรวจสอบว่าข้อมูลถูกอ่านอย่างถูกต้อง joptionpane หรือไม่ joptionpane.information_message); System.Exit (0); } else {string dataoriginal = สตริงใหม่ (ข้อมูล); // แปลงข้อมูลอาร์เรย์ไบต์เป็นสตริงที่บันทึกสตริงข้อมูลต้นฉบับ datavalid = ""; // ข้อมูลที่ถูกต้อง (ใช้เพื่อบันทึกสตริงข้อมูลต้นฉบับและลบสตริงหลังจากเริ่มต้น * number) string [] องค์ประกอบ = null; // ใช้เพื่อบันทึกอาร์เรย์สตริงที่ได้รับหลังจากแยกสตริงดั้งเดิมโดยช่องว่าง // แยกวิเคราะห์ข้อมูลถ้า (dataoriginal.charat (0) == ' *') {// เมื่ออักขระแรกของข้อมูลคือหมายเลข * หมายความว่าการรับข้อมูลเสร็จสมบูรณ์ องค์ประกอบ = datavalid.split (""); if (องค์ประกอบ == null || elements.length <1) {// ตรวจสอบว่าข้อมูลถูกแยกวิเคราะห์อย่างถูกต้อง joptionpane.showMessageDialog (null, "กระบวนการแยกวิเคราะห์ข้อมูลมีข้อผิดพลาดโปรดตรวจสอบอุปกรณ์หรือโปรแกรม!", "ข้อผิดพลาด", joptionpane.information_message); System.Exit (0); } else {ลอง {// อัพเดตค่าป้ายกำกับอินเตอร์เฟส/*สำหรับ (int i = 0; i <elements.length; i ++) {system.out.println (องค์ประกอบ [i]); }*///system.out.println("win_dir: " + องค์ประกอบ [5]); Tem.Settext (องค์ประกอบ [0] + "℃"); hum.settext (องค์ประกอบ [1] + " %"); Pa.Settext (องค์ประกอบ [2] + "HPA"); Rain.settext (องค์ประกอบ [3] + "MM"); win_sp.settext (องค์ประกอบ [4] + "m/s"); win_dir.settext (องค์ประกอบ [5] + "°"); } catch (arrayIndexoutofboundsexception e) {joptionpane.showMessagedialog (null, "กระบวนการวิเคราะห์ข้อมูลมีข้อผิดพลาดและข้อมูลอินเตอร์เฟสการอัปเดตล้มเหลว! โปรดตรวจสอบอุปกรณ์หรือโปรแกรม!", "ข้อผิดพลาด" System.Exit (0); }}}}}}} catch (readdataFromserialportFailure | serialportinputstreamclosefailure e) {joptionpane.showMessagedialog (null, e, "ข้อผิดพลาด", joptionpane.information_message); System.Exit (0); // ออกจากระบบหลังจากข้อความแสดงข้อผิดพลาดจะปรากฏขึ้นเมื่อเกิดข้อผิดพลาดในการอ่าน} break; -กำลังใช้ภาพหน้าจอ:
ดาวน์โหลดซอร์สโค้ดโครงการทั้งหมด: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(vevb.com).rar
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น