บทความนี้แบ่งปันรหัสเฉพาะสำหรับ Java เพื่อใช้การสื่อสารแบบอนุกรมสำหรับการอ้างอิงของคุณ เนื้อหาเฉพาะมีดังนี้
1. บทนำ
โปรแกรมการสื่อสารแบบอนุกรมที่ดำเนินการโดย Java สนับสนุนการส่งและรับข้อมูล hexadecimal
ซอร์สโค้ด: serialportdemo
การเรนเดอร์มีดังนี้:
2.RXTXCOMM
Java Serial Communication Dependency Jar แพ็คเกจ rxtxComm.jar
ดาวน์โหลดที่อยู่: http://download.csdn.net/detail/kong_gu_you_lan/9611334
รวมถึงการใช้เวอร์ชัน 32 บิตและ 64 บิต:
คัดลอก rxtxComm.jar ไปยังไดเรกทอรี java_home/jre/lib/ext;
คัดลอก rxtxserial.dll ลงในไดเรกทอรี java_home/jre/bin;
คัดลอก rxtxparallel.dll ลงในไดเรกทอรี java_home/jre/bin;
java_home เป็นเส้นทางการติดตั้ง JDK
3. การจัดการการสื่อสารพอร์ตอนุกรม
SerialportManager ใช้การจัดการการสื่อสารพอร์ตอนุกรมรวมถึงการค้นหาพอร์ตที่มีอยู่การเปิดและปิดพอร์ตอนุกรมและการส่งและรับข้อมูล
แพ็คเกจ com.yang.serialport.Manage; นำเข้า gnu.io.Commport; นำเข้า gnu.io.CommportIdentifier; นำเข้า gnu.io.nosuchportexception; นำเข้า gnu.io.portinuseexception; นำเข้า gnu.io.serialport; java.io.ioException; นำเข้า java.io.InputStream; นำเข้า java.io.OutputStream; นำเข้า java.util.arraylist; นำเข้า java.util.enumeration; นำเข้า java.util.toomanylistenerSexception; com.yang.serialport.exception.portinuse; นำเข้า com.yang.serialport.exception.readdataFromserialportfailure นำเข้า com.yang.serialport.exception.senddatoSerialportfailure; นำเข้า com.yserialport.exception.serial com.yang.serialport.exception.serialportoutputstreamclosefailure; นำเข้า com.yang.serialport.exception.serialportparameterfailure; นำเข้า com.yang.serialport.exception.toomanylisteners;/*** ชื่อพอร์ตที่มีอยู่*/ @suppresswarnings ("ไม่ได้ตรวจสอบ") อาร์เรย์ลิสต์สุดท้ายคงที่ <string> findport () {// รับพอร์ตอนุกรมการแจงนับทั้งหมดที่มีอยู่ในปัจจุบัน ArrayList <String> portnamelist = new ArrayList <String> (); // เพิ่มชื่อพอร์ตอนุกรมที่มีอยู่ในรายการและส่งคืนรายการในขณะที่ (portlist.hasmoreElements ()) {String portname = portlist.nextelement (). getName (); portnamelist.add (Portname); } ส่งคืน portnamelist; } /*** เปิดพอร์ตอนุกรม** @param พอร์ตชื่อ* ชื่อพอร์ต* @param baudrate* อัตราการส่งข้อมูล* @return วัตถุพอร์ตอนุกรม* @throws serialportparameterfailure* ล้มเหลวในการตั้งค่าพารามิเตอร์พอร์ตอนุกรม ถูกครอบครอง*/ สาธารณะคงที่ serialport final openport (สตริงพอร์ต, int baudrate) พ่น serialparameterfailure, notaserialport, nosuchport, portinuse {ลอง {// ระบุพอร์ตตามชื่อพอร์ต portidentifier portidentifier = promportidentifier. // เปิดพอร์ตตั้งค่าชื่อพอร์ตและการหมดเวลา (เวลาหมดเวลาในการเปิดการดำเนินการ) 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 ใหม่ (); } ส่งคืนอนุกรม; } else {// ไม่ใช่พอร์ตอนุกรมโยน notaserialport ใหม่ (); }} catch (nosuchportexception e1) {โยน nosuchport ใหม่ (); } catch (portinuseException e2) {โยน portinuse ใหม่ (); }} / *** ปิดพอร์ตอนุกรม** @param serialport* วัตถุพอร์ตอนุกรมที่จะปิด* / public static void closeport (serialport serialport) {ถ้า (serialport! = null) {serialport.close (); serialport = null; }} / *** ส่งข้อมูลไปยังพอร์ตอนุกรม** @param serialport* วัตถุพอร์ตอนุกรม* @param order* ข้อมูลที่จะส่ง* @throws senddatoSerialportfailure* ไม่สามารถส่งข้อมูลไปยังพอร์ตอนุกรม* @throws serialportputportStreamClosefailure คำสั่งซื้อ) พ่น 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* เกิดข้อผิดพลาดในขณะที่อ่านข้อมูลจากพอร์ตซีเรียล readfromport (serialport serialport) พ่น readdatafromserialportfailure, serialportinputstreamclosefailure {inputstream ใน = null; ไบต์ [] ไบต์ = null; ลอง {in = serialport.getInputStream (); // รับความยาวข้อมูล int ใน buffer bufflenth = in.available (); ในขณะที่ (bufflenth! = 0) {// เริ่มต้นอาร์เรย์ไบต์ให้เป็นความยาวของข้อมูลในบัฟเฟอร์ไบต์ = ไบต์ใหม่ [bufflenth]; in.read (ไบต์); bufflenth = in.available (); }} catch (ioexception e) {โยน readdataFromserialportFailure ใหม่ (); } ในที่สุด {ลอง {ถ้า (ใน! = null) {in.close (); ใน = null; }} catch (ioexception e) {โยน serialportinputstreamclosefailure ใหม่ (); }} ส่งคืนไบต์; } / ** * เพิ่มผู้ฟัง * * @param พอร์ต * วัตถุพอร์ตอนุกรม * @param Listener * ผู้ฟังพอร์ตอนุกรม * @throws toomanylisteners * toomanylisteners * toomanylistener มากเกินไปการฟังคลาสการฟัง * / void addlistener port.addeventListener (ผู้ฟัง); // ตั้งค่าเธรดรับการรับการปลุกเมื่อข้อมูลมาถึงพอร์ต NotifyondataAvailable (จริง); // ตั้งค่าเธรดการปลุกปลุกเมื่อการสื่อสารถูกขัดจังหวะพอร์ต NotifyonBreakInterrupt (จริง); } catch (toomanylistenersexception e) {โยน toomanylisteners ใหม่ (); -4. โปรแกรมหลักของโปรแกรม
/ * * mainframe.java * * สร้างขึ้นเมื่อ 2016.8.19 */แพ็คเกจ com.yang.serialport.ui; นำเข้า gnu.io.serialport; นำเข้า gnu.io.serialportevent; นำเข้า gnu.io.serialporteventListener; java.awt.point; นำเข้า java.awt.event.actionEvent; นำเข้า java.awt.event.ActionListener; นำเข้า java.util.list; นำเข้า javax.swing.borderfactory; นำเข้า Javax.swing.jbutton; javax.swing.jpanel; นำเข้า Javax.swing.jscrollpane; นำเข้า Javax.swing.jtextarea; นำเข้า Javax.swing.jtextfield; นำเข้า com.yang.serialport.exception.nosuchport; com.yang.serialport.exception.senddatoSerialportfailure; นำเข้า com.yang.serialport.exception.serialportputstreamclosefailure; นำเข้า com.yang.serialport.exception.serialportparameterfailure; com.yang.serialport.Manage.SerialportManager; นำเข้า com.yang.serialport.utils.byteutils; นำเข้า com.yang.serialport.utils.showutils;/*** อินเทอร์เฟซหลัก** @author yangle*/คลาสสาธารณะ / *** ความสูงของโปรแกรมอินเทอร์เฟซ*/ สาธารณะคงที่ความสูง int สุดท้าย = 360; private jtextarea dataView = new jtextarea (); JSCrollpane ส่วนตัว scrolldataview = new JScrollpane (DataView); // การตั้งค่าพอร์ตอนุกรมแผงส่วนตัว jpanel serialportpanel = new JPanel (); Private Jlabel serialportlabel = new Jlabel ("พอร์ตอนุกรม"); ส่วนตัว jlabel baudratelabel = new jlabel ("baudrate"); ส่วนตัว jcombobox commchoice = new Jcombobox (); ส่วนตัว jcombobox baudratechoice = new jcombobox (); // แผงการดำเนินการ JPanel ส่วนตัวดำเนินการ PANEL = ใหม่ JPANEL (); ส่วนตัว jtextfield datainput = new Jtextfield (); Private JButton serialportoperate = new JButton ("Open Serial Port"); ส่วนตัว JButton senddata = new JButton ("ส่งข้อมูล"); รายการส่วนตัว <String> commlist = null; อนุกรมพอร์ตส่วนตัว เมนเฟรมสาธารณะ () {initView (); initcomponents (); ActionListener (); initData (); } private void initView () {// ปิดโปรแกรม setDefaultCloseOperation (javax.swing.windowconstants.exit_on_close); // ห้ามใช้หน้าต่างสูงสุด setResizable (เท็จ); // ตั้งค่าหน้าต่างโปรแกรมเป็นจุดกึ่งกลาง p = graphicsenvironment.getLocalgraphicsenvironment () .getCenterPoint (); setbounds (px - ความกว้าง / 2, py - ความสูง / 2, ความกว้าง, ความสูง); this.setLayout (NULL); Settitle ("การสื่อสารแบบอนุกรม"); } private void initcomponents () {// data display dataview.setFocusable (false); Scrolldataview.setbounds (10, 10, 475, 200); เพิ่ม (scrolldataview); // serialportpanel.setBorder (BorderFactory.CreateTitledBorder ("serialportset")); serialportpanel.setbounds (10, 220, 170, 100); serialportpanel.setLayout (null); เพิ่ม (serialportpanel); serialportlabel.setforeground (color.gray); serialportlabel.setbounds (10, 25, 40, 20); serialportpanel.add (serialportlabel); commchoice.setFocusable (เท็จ); commchoice.setbounds (60, 25, 100, 20); serialportpanel.add (commchoice); Baudratelabel.setforeground (color.gray); Baudratelabel.setbounds (10, 60, 40, 20); serialportpanel.add (Baudratelabel); Baudratechoice.setFocusable (เท็จ); Baudratechoice.setbounds (60, 60, 100, 20); serialportpanel.add (Baudratechoice); // Operation OperatePanel.SetBounds (200, 220, 285, 100); OperatePanel.SetLayout (NULL); เพิ่ม (OperatePanel); datainput.setBounds (25, 25, 235, 20); usicatePanel.ADD (Datainput); serialportoperate.setFocusable (เท็จ); serialportoperate.SetBounds (45, 60, 90, 20); OperatePanel.add (serialportoperate); senddata.setFocusable (เท็จ); senddata.setbounds (155, 60, 90, 20); OperatePanel.add (senddata); } @suppresswarnings ("ไม่ได้ตรวจสอบ") เป็นโมฆะส่วนตัว initData () {commlist = serialportmanager.findport (); // ตรวจสอบว่ามีพอร์ตอนุกรมเพิ่มลงในตัวเลือกถ้า (commlist == null || commlist.size () <1) {showutils.warningMessage ("ไม่พบพอร์ตอนุกรมที่ถูกต้อง!"); } else {สำหรับ (String s: commlist) {commchoice.additem (s); }} baudratechoice.additem ("9600"); Baudratechoice.additem ("19200"); Baudratechoice.additem ("38400"); Baudratechoice.additem ("57600"); Baudratechoice.additem ("115200"); } โมฆะส่วนตัว actionListener () {serialportoperate.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {ถ้า ("Open Serial Port" .equals (serialportoperate.getText () - senddata.addactionListener (ใหม่ actionListener () {@Override โมฆะสาธารณะ ActionPerformed (ActionEvent E) {senddata (e);}}); } / *** เปิดพอร์ตอนุกรม** @param evt* คลิกเหตุการณ์* / โมฆะส่วนตัว openserialport (java.awt.event.actionEvent evt) {// รับสตริงชื่อพอร์ตอนุกรม commname = (String) commchoice.getSelectedItem (); // รับอัตราการรับส่งข้อมูล int baudrate = 9600; สตริง bps = (สตริง) baudratechoice.getSelectedItem (); baudrate = integer.parseint (bps); // ตรวจสอบว่าชื่อพอร์ตอนุกรมนั้นถูกต้องถ้า (commname == null || commname.equals ("")) {showutils.warningMessage ("ไม่พบพอร์ตอนุกรมที่ถูกต้อง!"); } else {ลอง {serialport = serialportmanager.openport (commname, baudrate); if (serialport! = null) {dataView.settext ("serialport เปิดใช้งาน" + "/r/n"); serialportoperate.settext ("ปิด serialport"); }} catch (serialportparameterfailure e) {e.printstacktrace (); } catch (nosuchport e) {e.printstacktrace (); } catch (portinuse e) {e.printstacktrace (); showutils.warningmessage ("พอร์ตอนุกรมถูกครอบครอง!"); }} ลอง {serialportmanager.addlistener (serialport, seriallistener ใหม่ ()); } catch (toomanylisteners e) {e.printstacktrace (); }} / *** ปิดพอร์ตอนุกรม** @param evt* คลิกเหตุการณ์* / โมฆะส่วนตัวปิดพอร์ต (java.awt.event.actionEvent evt) {serialportmanager.closeport (serialport); dataview.settext ("พอร์ตอนุกรมปิด" + "/r/n"); serialportoperate.settext ("Open Serial Port"); } / *** ส่งข้อมูล** @param evt* คลิกเหตุการณ์* / โมฆะส่วนตัว senddata (java.awt.event.actionEvent evt) {// ป้อนอักขระ hexadecimal โดยตรงในกล่องอินพุตความยาวจะต้องเป็น String data = datainput.getText () tostring (); ลอง {serialportmanager.sendToport (serialport, byteutils.hexstr2byte (ข้อมูล)); } catch (senddatatoserialportfailure e) {e.printstacktrace (); } catch (serialportoutputstreamclosefailure e) {e.printstacktrace (); }} คลาสส่วนตัว seriallistener ใช้ serialporteventListener { / *** จัดการเหตุการณ์พอร์ตอนุกรมที่ได้รับการตรวจสอบ* / โมฆะสาธารณะ serialEvent (serialportevent serialportevent) {switch (serialportevent.getEventType ()) หยุดพัก; case serialportevent.oe: // 7 overflow (ล้น) ข้อผิดพลาดกรณี case case serialportevent.fe: // 9 ข้อผิดพลาดเฟรมกรณี case case case serialportevent.pe: // 8 ข้อผิดพลาด parity case case serialportevent.cd: // 6 การตรวจจับผู้ให้บริการ case case: // ตัวบ่งชี้วงแหวนกรณี serialportevent.Output_buffer_empty: // 2 บัฟเฟอร์เอาต์พุตถูกล้าง case serialportevent.data_available: // 1 ข้อมูลที่มีอยู่มีอยู่ในพอร์ตซีเรียลไบต์ [] data = null; ลอง {ถ้า (serialport == null) {showutils.errorMessage ("วัตถุพอร์ตอนุกรมว่างเปล่า! การตรวจสอบล้มเหลว!"); } else {// อ่านข้อมูลพอร์ตอนุกรม = serialportManager.ReadFromport (serialport); dataView.Append (byteutils.bytearraytohexstring (data, true) + "/r/n"); }} catch (exception e) {showutils.errorMessage (e.toString ()); // ออกจากระบบหลังจากแสดงข้อผิดพลาดเมื่อเกิดข้อผิดพลาดในการอ่าน System.Exit (0); } หยุดพัก; }}} โมฆะคงที่สาธารณะหลัก (สตริง args []) {java.awt.eventqueue.invokelater (ใหม่ runnable () {โมฆะสาธารณะเรียกใช้ () {เมนเฟรมใหม่ (). setVisible (จริง);}}); -5. เขียนในตอนท้าย
ซอร์สโค้ดดาวน์โหลดที่อยู่: SerialPortDemo
นักเรียนยินดีที่จะบ่นและแสดงความคิดเห็น หากคุณคิดว่าบล็อกนี้มีประโยชน์สำหรับคุณให้ฝากข้อความหรือแสดงความคิดเห็น (^-^)
ขอบคุณ: การเขียนเครื่องมือการสื่อสารแบบอนุกรมตาม Java
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น