この記事では、Javaの特定のコードを共有して、リファレンス用にシリアル通信を実装しています。特定のコンテンツは次のとおりです
1。はじめに
Javaが実施するシリアル通信プログラムは、16進数データの送信と受信をサポートしています。
ソースコード:SerialPortdemo
レンダリングは次のとおりです。
2.RXTXCOMM
Javaシリアル通信依存関係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; Import gnu.io.commport; import gnu.io.commportidentifier; Import gnu.io.nosuchportexception; Import gnu.io.portinuseexception; Import gnu.io.serialport; Import gnu.io.io.serialporteventlistener; Import; gnu.io.unsupportedCommoperationException; Import java.io.ioexception; Import java.io.inputStream; Import java.io.outputStream; Import java.util.ArrayList; Import java.util.Numeration; Import java.util.utilanexception;インポート; com.yang.serialport.exception.nosuchport; Import com.yang.serialport.exception.notaserialport; Import com.yang.section.exception.portinuse; import com.yang.serialport.exception.exception.reddatafromserialportfailure; import com.yang.eanialport.excectoserialearialearialearialearialearialearialearialearialearialearialearialearialearialearialearialearialportoperure com.yang.serialport.exception.serialportinputStreamClosefailure; Import com.yang.yang.serialport.exception.serialportputStreamCloseFailure; Import com.yang.serialport.exception.SerialPortParametarFailure; Import com.yang.SerialPort.Exception.toomanylisteners; */public class serialportmanager {/***利用可能なすべてのポートを見つけます** @return可能なポート名のリスト*/@suppresswarnings( "unchecked")public static final arraylist <string> findport(){// ArrayList <String> portnameList = new ArrayList <String>(); //使用可能なシリアルポート名をリストに追加し、[portlist.hasmoreelements()){string portname = portlist.nextelement()。getName(); portnameList.add(portname); } portnameListを返します。 } /***オープンシリアルポート** @param portname*ポート名* @param baudrate* baud rate* @returnシリアルポートオブジェクト* @throwsシリアルポートパラメーター* @throws notaserialport*ポートポートはデバイスのタイプではありません。占有されています*/ public static final serialport openport(string portname、int baudrate)Slows serialportparameterfailure、notaserialport、nosuchport、portinuse {//ポートネームcommportidentifier portidentifier = commportidentifier .getportidefier(portname); //ポートを開き、ポート名とタイムアウト(オープニングオペレーションのタイムアウト時間)Commport commport = portidentidifier.open(Portname、2000)を設定します。 //それがシリアルポートであるかどうかを決定する(commport in serialport){serialport serialport =(serialport)commport; try {//シリアルポートSerialport.setSerialPortparams(baudrate、serialport.databits_8、serialport.stopbits_1、serialport.parity_none)のボーレートおよびその他のパラメーターを設定します。 } catch(unsupportedcommoperationexception e){新しいserialpormparameterfailure(); } serialportを返します。 } else {//シリアルポートスローnew notaserialport(); }} catch(nosuchportexception e1){throw new nosuchport(); } catch(portinuseexception e2){new portinuse(); }} / ***シリアルポートを閉じます** @param serialport*シリアルポートオブジェクトは閉じますserialport = null; }} / ***データをシリアルポートに送信** @param Serialport* Serial Port Object* @param Order* @Throws SendDatoSerialPortFailure* SERIAL PORT* @THROWS SERIALPUTPUTSTREAMCLOSEFAILURE* THROWS SERIALPUTTSTREAMCLOSEFAILURE* SERIAL PORT OFBOTINT ERRITE [SERIAL STATIC BYIID ERROTの閉鎖]注文)SendDatatoSerialPortFailure、SerialPutputStreamCloseFailure {outputStream Out = null; try {out = serialport.getOutputStream(); out.write(注文); out.flush(); } catch(ioException e){新しいsenddatoserialportfailure(); }最後に{try {if(out!= null){out.close(); out = null; }} catch(ioException e){new serialportOutputStremCloseFailure(); }}} / ***シリアルポートからデータを読み取る** @param serialport*現在確立されている接続を持つシリアルポートオブジェクト* @returnデータread* @throws readdatafromserialportfailure*シリアルポートの読み取り中にエラーが発生しました* @throws serialportinputstreamclosefailure* serialportinputstreamclosefailure*エラーが発生したときにエラーが発生しました[] readfromport(serialport serialport)は、readdatafromserialportfailure、serialportinputstreamclosefailure {inputstream in = null; byte [] bytes = null; try {in = serialport.getInputStream(); // buffer bufflenth = in.abailable()でデータの長さintを取得します。 while(bufflenth!= 0){//バッファーバイトのデータの長さにバイト配列を初期化= new byte [Bufflenth]; in.read(bytes); Bufflenth = in.abailable(); }} catch(ioException e){新しいReadDataFromserialPortFailure(); }最後に{try {if(in!= null){in.close(); in = null; }} catch(ioException e){new serialPortinputStremCloseFailure(); }}バイトを返します。 } / ** *リスナーの追加 * * @paramポート *シリアルポートオブジェクト * @paramリスナー *シリアルポートリスナー * @throws toomanylisteners * toomanylisteners * toomanylistener * / public static addlistener(シリアルポートポート、シリアルポートリスナーのリスナーを投げる{ PORT.ADDEVENTLISTENER(リスナー); //データが届くとウェイクアップリスニング受信スレッドを設定します。port.notifyondataavailable(true); //通信が中断されたときにウェイクアップ割り込みスレッドを設定しますport.notifyOnbreakinterrupt(true); } catch(toomanylistenersexception e){new toomanylisteners(); }}}4。プログラムメインウィンドウ
/ * * mainframe.java * * 2016.8.19に作成された */パッケージcom.yang.serialport.ui; Import gnu.io.serialport; Import gnu.io.serialportevent; Import gnu.io.serialporteventListener; Import Java.awt.color; Import Java.aw.awt.graphicesenviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviseNviscolon; java.awt.point; Import java.awt.event.actionevent; Import java.awt.event.actionlistener; Import java.util.list; import javax.swing.borderfactory; import javax.swing.jbutton; import javax.Javax.swing.swing javax.swing.jpanel; Import javax.swing.jscrollpane; Import javax.swing.jtextarea; import javax.swing.jtextfield; import com.yang.serialport.exception.nosuchport; import com.yang.yang.serialport.exception.notasiarport.inagerport. com.yang.serialport.exception.senddatatoserialportfailure; Import com.yang.yang.serialport.exception.serialporttputStreamClosefailure; Import com.yang.serialport.exception.serialportparameterfailure; import com.yang.serialport.exception.toomanylisteners; Import com.yang.serialport.manage.serialportmanager;インポートcom.yang.serialport.utils.byteutils; import com.yang.yang.utils.showutils;/*** @author yangle** @author yangle*/public class mainframe extends jframe {/**プログラムインターフェイスintic / ***プログラムインターフェイス高さ*/ public static final int height = 360; private jtextarea dataview = new jtextarea();プライベートjscrollpane scrolldataview = new jscrollpane(dataview); //シリアルポート設定パネルprivate jpanel serialportpanel = new JPanel(); Private JLabel SerialPortLabel = new JLabel( "Serial Port");プライベートJlabel baudratelabel = new Jlabel( "Baudrate"); private jcombobox commchoice = new jcombobox(); private jcombobox baudratechoice = new jcombobox(); //操作パネルprivate jpanel operatepanel = new JPanel(); private jtextfield datainput = new jtextfield(); Private JButton SerialPortoperate = new JButton( "Open Serial Port"); Private jbutton senddata = new jbutton( "send data");プライベートリスト<String> commlist = null;プライベートシリアルポートシリアルポート。 public mainframe(){initview(); initComponents(); ActionListener(); initdata(); } private void initView(){//プログラムSetDefaultCloseOperation(javax.swing.windowconstants.exit_on_close); // windowの最大化を禁止するset Ressable(false); //プログラムウィンドウを中心ポイントP = GraphicsEnvironment.getLocalGraphicsEnvironment().GetCenterPoint()に設定します。セットバウンド(PX -width / 2、py -height / 2、width、height); this.setlayout(null); Settitle( "シリアル通信"); } private void initcomponents(){//データ表示dataview.setFocusable(false); scrolldataview.setbounds(10、10、475、200); add(scrolldataview); // serialPortpanel.setborder(borderfactory.createTitledborder( "serialportset")); SerialPortpanel.setbounds(10、220、170、100); SerialPortpanel.setLayout(null); add(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); // OperatePanel.setBoundsの操作(200、220、285、100); operatePanel.setLayout(null); add(operatePanel); datainput.setbounds(25、25、235、20); OperatePanel.Add(datainput); serialPortoperate.setFocusable(false); serialportoperate.setbounds(45、60、90、20); OperatePanel.Add(SerialPortoperate); senddata.setFocusable(false); senddata.setbounds(155、60、90、20); OperatePanel.Add(SendData); } @suppresswarnings( "unchecked")private void initdata(){commlist = serialportmanager.findport(); //シリアルポートがあるかどうかを確認するには、[commlist == null || commlist.size()<1){showutils.warningmessage( "有効なシリアルポートは見つかりませんでした!"); } else {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(serialporterate.getText())&& serialport == null){e e e }}); senddata.addActionListener(new ActionListener(){@Override public void ActionPerformed(ActionEvent e){sendData(e);}}); } / *** SERIAL PORTを開く** @param evt*クリックイベント* / private void openserialport(java.awt.event.actionevent evt){//シリアルポート名commname =(string)commchoice.getSelectedItem(); //ボーレートint baudrate = 9600を取得します。 string bps =(string)baudratechoice.getSelectedItem(); baudrate = integer.parseint(bps); //シリアルポート名が正しいかどうかを確認します(commname == null || commname.equals( "")){showutils.warningmessage( "有効なシリアルポートは見つかりませんでした!"); } else {try {serialport = serialportmanager.openport(commname、baudrate); if(serialport!= null){dataview.settext( "serialportがオンになっている" + "/r/n"); serialPortoperate.settext( "close serialport"); }} catch(serialPormetarfailure e){e.printstacktrace(); } catch(nosuchport e){e.printstacktrace(); } catch(portinuse e){e.printstacktrace(); showutils.warningmessage(「シリアルポートが占有されている!」); }} try {serialportmanager.addlistener(serialport、new seriallistener()); } catch(toomanylisteners e){e.printstacktrace(); }} / ***シリアルポートを閉じる** @param evt*クリックイベント* / private void closeSerialport(java.awt.event.actionevent evt){serialportmanager.closeport(serialport); dataview.settext( "シリアルポートは閉じられている" + "/r/n"); serialPortoperate.settext( "SERIAL PORTを開く"); } / ***データの送信** @param evt*イベントをクリック* / private void senddata(java.awt.event.actionevent evt){//入力ボックスに直接hexadecimal文字を直接入力する必要があります。 try {serialportmanager.sendtoport(serialport、byteutils.hexstr2byte(data)); } catch(senddatatoserialportfailure e){e.printstacktrace(); } catch(serialportOutputStreamCloseFailure e){e.printstacktrace(); }} private class seriallistenerは、SerialPorteventEventListener { / ***監視対象のシリアルポートイベント* / public void serialevent(serialportevent serialportevent){switch(serialportevent.geteventtype()){case serialportevent.bi:// 10通信中断ショーカットリルメッシャーのデバイス( ");壊す; case serialportevent.oe:// 7オーバーフロー(オーバーフロー)ケースserialportevent.fe:// 9フレームエラーケースserialportevent.pe:// 8パリティエラーケースserialportevent.cd:// 6キャリア検出ケースシリアルポートエベント。 serialportevent.output_buffer_empty:// 2 serialportevent.output_buffer_empty:// 2は、ブレークをクリアしています。 case serialportevent.data_available://使用可能なデータがシリアルポートバイトに存在します[] data = null; try {if(serialport == null){showutils.errormessage( "シリアルポートオブジェクトは空です!監視が失敗!"); } else {//シリアルポートデータデータ= serialportmanager.readfromport(serialport); dataview.append(byteutils.bytearraytohexstring(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
学生は不平を言ってコメントすることを歓迎します。このブログが役立つと思われる場合は、メッセージを残すか、コメントをしてください(^-^)
ありがとう:Javaに基づいたシリアルコミュニケーションツールの作成
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。