تشارك هذه المقالة الكود المحدد لـ Java لتنفيذ الاتصال التسلسلي للرجوع إليه. المحتوى المحدد كما يلي
1. مقدمة
يدعم برنامج الاتصال التسلسلي الذي تنفذه Java إرسال وتلقي البيانات السداسية.
رمز المصدر: SerialPortDemo
العروض كما يلي:
2.rxtxComm
Java Serial Communication Dependency Jar Package 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 ؛
نسخ rxtxparald.dll في دليل java_home/jre/bin ؛
Java_home هو مسار تثبيت JDK
3. إدارة اتصالات المنفذ التسلسلية
يقوم SerialPortManager بتنفيذ إدارة اتصالات المنفذ التسلسلية ، بما في ذلك العثور على المنافذ المتاحة ، وفتح وإغلاق المنفذ التسلسلي ، وإرسال واستلام البيانات.
package com.yang.serialport.manage ؛ استيراد gnu.io.ocomport ؛ استيراد gnu.io.Omportidentifier ؛ import gnu.io.nosuchportException ؛ import gnu.io.portinuseexception ؛ import gnu.io.serialport ؛ import gnu.io.serialporteventErnistener ؛ import gnu.unsupperation ؛ java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.util.arraylist ؛ استيراد java.util.enumeration ؛ java.util.toomanylistenersexception ؛ الاستيراد com com.yang.serialport.exception.portinuse ؛ استيراد com.yang.serialport.exception.readdatafromserialportFailure ؛ استيراد com.yang.serialport.exception.senddatatoserialportfailure ؛ import com.yang.serialport.exception.serialportinputstreamureure ؛ com.yang.serialport.exception.serialportoutouttreamclosefailure ؛ استيراد com.yang.serialport.exception.serialportparameterfailure ؛ استيراد com.yang.serialport.exception.toomanylisteners ؛/** أسماء المنافذ المتاحة*/ suppressWarnings ("Unchected") Final Static Finallist <String> findport () {// الحصول على جميع المنافذ التسلسلية المتاحة حاليًا التعداد <SaintIdentIdeFier> portlist = commportidentifier .getPortIndIdentifiers () ؛ ArrayList <string> portnamelist = new ArrayList <String> () ؛ // أضف اسم المنفذ التسلسلي المتاح إلى القائمة وإرجاع القائمة بينما (portlist.hasmoreElements ()) {String portName = portlist.nextElement (). getName () ؛ portnamelist.add (PortName) ؛ } إرجاع portnamelist ؛ } /*** فتح المنفذ التسلسلي** param portname* اسم المنفذ* param baudrate* معدل baud* كائن المنفذ التسلسلي* throws serialportparameterfailure* فشل في تعيين معلمات المنفذ التسلسلي* throos notaserialport* ميناء يشير إلى الجهاز ليس من نوع المنفذ serial* @ احتلت*/ عامة ثابتة للسلسلة النهائية OpenPort (سلسلة PortName ، Int Baudrate) يلقي SerialPortParameterFailure ، notaserialport ، nosuchport ، portinuse {try {// تحديد المنفذ بواسطة name port commportidentifier portidentifier = commportidentifier. // افتح المنفذ ، وقم بتعيين اسم المنفذ ومهلة المهلة (وقت العملية للعملية) // حدد ما إذا كان منفذًا متسلسلًا إذا (مثيل Commport SerialPort) {SerialPort SerialPort = (SerialPort) Commport ؛ جرب {// تعيين معدل البذور والمعلمات الأخرى للميناء التسلسلي serialport.SetSerialPortParams (baudrate ، serialport.databits_8 ، serialport.stopbits_1 ، serialport.parity_none) ؛ } catch (UnsupportedCommoperationException e) {رمي SerialPortParameterFailure () ؛ } إرجاع SerialPort ؛ } آخر {// ليس المنفذ التسلسلي رمي notaserialport جديد () ؛ }} catch (nosuchportException e1) {throw new nosuchport () ؛ } catch (portInuseexception e2) {throw new portinuse () ؛ }} / *** أغلق المنفذ التسلسلي** param serialport* كائن المنفذ التسلسلي ليتم إغلاقه* / closeport static void (serialport serialport) {if (serialport! = null) {serialport.close () ؛ SerialPort = null ؛ }} / *** إرسال البيانات إلى المنفذ التسلسلي** param serialport* كائن المنفذ التسلسلي* string order* data يتم إرساله* throws sendDatatoSerialPortFailure* فشل إرسال البيانات إلى المنفذ التسلسلي* throols serialPortOutputTreamClosefailure رميات sendDatoSerialPortFailure ، serialPortOutPutStreamCloseFailure {outputStream out = null ؛ حاول {out = serialport.getOutputStream () ؛ out.write (أمر) ؛ out.flush () ؛ } catch (ioException e) {رمي sendDatatoSerialPortFailure () ؛ } أخيرًا {try {if (out! = null) {out.close () ؛ خارج = فارغ ؛ }} catch (ioException e) {رمي SerialPortOutPutTreamCloseFailure () ؛ }}} / *** اقرأ البيانات من المنفذ التسلسلي** param serialport* كائن SerialPort مع الاتصال المعمول به حاليًا* Return قراءة البيانات* throws readDataFromSerialPortFailure readfromport (SerialPort SerialPort) يلقي readdatafromserialportfailure ، serialportInputStreamCloseFailure {inputStream in = null ؛ بايت [] بايت = فارغة ؛ حاول {in = serialport.getInputStream () ؛ // احصل على طول البيانات int في bufflenth العازلة = in.available () ؛ بينما (bufflenth! = 0) {// قم بتهيئة صفيف البايت إلى طول البيانات في بايت العازلة = بايت جديد [bufflenth] ؛ in.read (بايت) ؛ bufflenth = in.available () ؛ }} catch (ioException e) {رمي جديد readDataFromSerialPortFailure () ؛ } أخيرًا {try {if (in! = null) {in.close () ؛ في = خالية ؛ }} catch (ioException e) {رمي SerialPortInputStreamCloseFailure () ؛ }} إرجاع بايت ؛ } / ** * إضافة مستمع * * param منفذ * كائن المنفذ التسلسلي * param المستمع * مستمع المنفذ التسلسلي * throws toomanylisteners * toomanylisteners * toomanylistener الكثير من كائنات فئة الاستماع * / public static addlistener (port serialport ، serialporterventener leacher) throws) throwsener {try {add {adddded. // قم بتعيين مؤشر ترابط الاستماع إلى الاستماع عند وصول البيانات إلى port.notifyondataavailable (true) ؛ // قم بتعيين مؤشر ترابط Wake-Up عند مقاطعة الاتصال. } catch (toomanylistenersexception e) {رمي toomanylisteners () ؛ }}}4. النافذة الرئيسية للبرنامج
/ * * mainframe.java * * تم إنشاؤه في 2016.8.19 */package com.yang.serialport.ui ؛ import gnu.io.serialport ؛ import gnu.io.serialportevent ؛ import gnu.io.serialporteventener ؛ import java.awt 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.nosception.nosuchport ؛ استيراد com.yang.serialport.exception.notaSerial ؛ com.yang.serialport.exception.senddatoSerialPortFailure ؛ import com.yang.serialport.exception.serialportoututputstreamclosefailure ؛ import com.yang.serialport.exception.serialportparameterfailure com.yang.serialport.manage.serialportmanager ؛ استيراد com.yang.serialport.utils.byteutils ؛ استيراد com.yang.serialport.utils.showutils ؛/*** الواجهة الرئيسية*** Author yangle*/public class mainframe تمتد Jframe {/*** / *** ارتفاع واجهة البرنامج*/ ارتفاع int static int static = 360 ؛ Private JTextarea dataview = new JTextarea () ؛ Private JScrollPane ScrollDataview = New JScrollPane (Dataview) ؛ // إعدادات المنفذ التسلسلي لجنة JPanel SerialPortPanel = New JPanel () ؛ الخاص Jlabel SerialPortLabel = New Jlabel ("Port Serial") ؛ الخاص Jlabel Baudratelabel = New Jlabel ("Baudrate") ؛ Private JCombobox Commchoice = New JCombobox () ؛ Private JCombobox Baudratechoice = New JCombobox () ؛ // PONECTION PINEM PRIVATE JPANEL OPERATEPANEL = New JPanel () ؛ Private JTextfield Datainput = new JTextField () ؛ الخاص Jbutton SerialPortOperate = New JButton ("منفذ المسلسل المفتوح") ؛ Private JButton SendData = New JButton ("إرسال البيانات") ؛ قائمة خاصة <string> commList = null ؛ Private Serialport Serialport ؛ mainframe العامة () {initview () ؛ initComponents () ؛ ActionListener () ؛ initData () ؛ } private void initview () {// أغلق البرنامج setDefaultCloseOperation (javax.swing.windowconstants.exit_on_close) ؛ // لا سمح النافذة تعظيم القابلة للاسترداد (خطأ) ؛ // قم بتعيين نافذة البرنامج على النقطة المركزية P = GraphicsEnvironment.getLocalGraphicsEnvironment () .getCenterPoint () ؛ setBounds (px - width / 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.CreatetTledBorder ("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 (false) ؛ commchoice.setBounds (60 ، 25 ، 100 ، 20) ؛ serialportpanel.add (commchoice) ؛ Baudratelabel.setForeGround (color.gray) ؛ Baudratelabel.setBounds (10 ، 60 ، 40 ، 20) ؛ SerialPortPanel.Add (Baudratelabel) ؛ baudratechoice.setFocusable (false) ؛ Baudratechoice.setBounds (60 ، 60 ، 100 ، 20) ؛ SerialPortPanel.Add (Baudratechoice) ؛ // Operation OperatePanel.setBounds (200 ، 220 ، 285 ، 100) ؛ proegratepanel.setLayout (NULL) ؛ إضافة (proegratepanel) ؛ datainput.setBounds (25 ، 25 ، 235 ، 20) ؛ prosepanpanel.add (datainput) ؛ SerialPortOperate.setFocusable (false) ؛ SerialPortOperate.setBounds (45 ، 60 ، 90 ، 20) ؛ proegratepanel.add (SerialPortOperate) ؛ SendData.SetFocusable (false) ؛ SendData.SetBounds (155 ، 60 ، 90 ، 20) ؛ prosepanel.add (SendData) ؛ } suppressWarnings ("Unchecked") private void initData () {commList = SerialPortManager.findport () ؛ // تحقق مما إذا كان هناك منفذ تسلسلي ، أضفه إلى الخيار إذا (commList == null || commList.size () <1) {showutils.warningMessage ("لم يتم العثور على منفذ تسلسلي صالح!") ؛ } آخر {for (string s: commList) {commchoice.additem (s) ؛ }} baudratechoice.additem ("9600") ؛ Baudratechoice.additem ("19200") ؛ Baudratechoice.additem ("38400") ؛ Baudratechoice.additem ("57600") ؛ Baudratechoice.additem ("115200") ؛ } private void actionListener () {serialPortOperate.AddActionListener (new ActionListener () {Override public void actionperformed (actionevent e) {if ("Open Serial Port" .equals (} e} SendData.AddActionListener (New ActionListener () {Override public void actionperformed (ActionEvent e) {sendData (e) ؛}}) ؛ } / *** فتح المنفذ التسلسلي** param evt* انقر فوق الحدث* / private void openserialport (java.awt.event.actionevent evt) {// الحصول على سلسلة المنفذ التسلسلي commName = (string) commchoice.getselectedIm () ؛ // احصل على معدل البود int baudrate = 9600 ؛ String BPS = (String) Baudratechoice.getSelectedItem () ؛ baudrate = integer.parseint (bps) ؛ // تحقق مما إذا كان اسم المنفذ التسلسلي صحيحًا إذا (commName == null || commName.equals ("")) {showutils.warningMessage ("لم يتم العثور على منفذ تسلسلي صالح!") ؛ } آخر {try {serialport = serialportmanager.openport (commname ، baudrate) ؛ if (serialport! = null) {dataview.settext ("يتم تشغيل serialport على" + "/r/n") ؛ SerialPortOperate.settext ("Close Serialport") ؛ }} catch (SerialPortParameterFailure e) {E.PrintStackTrace () ؛ } catch (nosuchport e) {E.PrintStackTrace () ؛ } catch (portinuse e) {e.printStackTrace () ؛ showtils.warningmessage ("تم احتلال الميناء التسلسلي!") ؛ }} Try {SerialPortManager.addListener (SerialPort ، New SerialListener ()) ؛ } catch (toomanylisteners e) {ePrintStackTrace () ؛ }} / *** أغلق المنفذ التسلسلي** param evt* انقر فوق الحدث* / private void closeSerialPort (java.awt.event.actionevent evt) {serialportmanager.closeport (serialport) ؛ dataview.settext ("المنفذ التسلسلي مغلق" + "/r/n") ؛ SerialPortOperate.settext ("Open Serial Port") ؛ } / *** إرسال البيانات** param evt* انقر فوق الحدث* / private void sendData (java.awt.event.actionevent evt) {// أدخل أحرف hexadecimal مباشرة في مربع الإدخال ، يجب أن يكون الطول حتى string data = datainput.gettext (). toString () ؛ حاول {SerialPortManager.SendToport (SerialPort ، byteutils.hexstr2byte (data)) ؛ } catch (sendDatatoSerialPortFailure e) {E.PrintStackTrace () ؛ } catch (SerialPortOutPutStreamCloseFailure e) {E.PrintStackTrace () ؛ }} private class serialListener تنفذ serialporteventevener { / *** التعامل مع أحداث المنفذ التسلسلي المراقبة* / public void serialevent (serialportevent serialportevent) {switch (serialportevent.geteventtype ()) {case serialportevent.bi: استراحة؛ CASE SerialPortEvent.oe: // 7 Overflow (overflow) خطأ في حالة serialportevent.fe: // 9 خطأ في الإطار قضية serialportevent.pe: // 8 خطأ تماثل القضية serialportevent.cd: // 6 detection case serialportever CASE CASE SerialPortEvent.output_buffer_empty: // 2 تم مسح المخزن المؤقت للإخراج. CASE SerialPortEvent.data_available: // 1 توجد بيانات متاحة على المنفذ التسلسلي بايت [] Data = null ؛ حاول {if (serialport == null) {showutils.errormessage ("كائن المنفذ التسلسلي فارغ! فشل المراقبة!") ؛ } آخر {// قراءة بيانات المنفذ التسلسلي = SerialPortManager.ReadFromport (SerialPort) ؛ dataview.append (byteutils.bytearraytoexstring (data ، true) + "/r/n") ؛ }} catch (استثناء e) {showutils.errormessage (e.toString ()) ؛ // الخروج من النظام بعد عرض خطأ عند حدوث خطأ في القراءة System.exit (0) ؛ } استراحة؛ }}} public static void main (string args []) {java.awt.eventqueue.invokelater (new RunNable () {public void run () {new Mainframe (). setVisible (true) ؛}}) ؛ }}5. مكتوب في النهاية
عنوان رمز المصدر عنوان تنزيل: SerialPortDemo
الطلاب مرحب بهم للشكوى والتعليق. إذا كنت تعتقد أن هذه المدونة مفيدة لك ، فاترك رسالة أو أعطها تعليقًا (^-^)
شكرا: كتابة أدوات الاتصال التسلسلية على أساس جافا
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.