이 기사는 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.oi.serialeventlistener; gnu.io.un java.io.ioexception; import java.io.inputStream; import java.io.outputStream; import java.util.arraylist; import java.util.enumeration; import java.util.toomanylistenersexception; import com.yang.serialport.xception.nosuchport; com.yang.serialport.exception.portinuse; import com.yang.serialport.exception.readdatafromserialportfailure; import com.yang.serialport.exception.senddatatoserialportfailure; import com.yang.serialport.exception.serialportinputstreamclosefailure; 가져 오기; com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;import com.yang.serialport.exception.SerialPortParameterFailure;import com.yang.serialport.exception.TooManyListeners;/** * Serial Port Management* * @author yangle */public class SerialPortManager { /** * Find all available ports* * @return List of available port 이름*/ @suppresswarnings ( "확인되지 않은") 공개 정적 최종 배열리스트 <string> findport () {// 현재 사용 가능한 모든 직렬 포트 열거 <compportidentifier> portlist = commportidentifier .getportidentifiers (); ArrayList <string> portnamelist = new ArrayList <string> (); // 사용 가능한 직렬 포트 이름을 목록에 추가하고 목록을 반환합니다. portnamelist.add (portname); } return portnamelist; } /*** 열린 직렬 포트** @param portname* 포트 이름* @param baudrate* baud rate* @return serial port 객체* @throws serialportparameterfailure* @throws를 설정하지 못했습니다. Portinuse * 포트는 */ public static final serialport openport (String portname, int baudrate) serialportparameterfailure, notaserialport, nosuchport, portinuse {try {// 포트 이름 commportidentifier = commportidentifier. // 포트를 열고 포트 이름 및 시간 초과를 설정합니다 (시간 초과 시간 개방 시간) COMMPORT COMMPORT = PORTINGIFIER.OPEN (PortName, 2000); // 직렬 포트인지 확인 if (Commport instancef serialport) {Serialport serialport = (Serialport) commport; try {// Serial Port Serialport.setSerialportParams의 Baud rate 및 기타 매개 변수를 설정하십시오 (Baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (UnsupportedCommoperationException e) {새 SerialportParameterFailure ()를 던집니다. } return serialport; } else {// 직렬 포트가 아닌 새로운 NotAserialport (); }} catch (nosuchportException e1) {throw new nosuchport (); } catch (portinuseexception e2) {Throw new Portinuse (); }} / *** 직렬 포트를 닫습니다** @param serialport* 닫을 직렬 포트 개체* / public static void ClosePort (Serialport serialport) {if (serialport! = null) {serialport.close (); serialport = null; }} / *** 직렬 포트로 데이터를 보냅니다* @param serialport* Serial Port Object* @Param Order* 보내기* @Throws SendDatatoserialportFailure* SendDatatoserialportFailure* 실패한 Serial Port에 데이터를 보내지 못했습니다* @Throws SerialPortOutoutPutStreamCloseFailure* Serial Port의 출력 스트리밍 오류를 닫습니다. Order) senddatatoserialportfailure, serialportOutputStreamCloseFailure {outputStream out = null; {out = serialport.getOutputStream (); out.write (Order); out.flush (); } catch (ioException e) {새 SendDatatoserialportFailure (); } 마침내 {try {if (out! = null) {out.close (); out = null; }} catch (ioException e) {새 SerialPortOutputStreamCloseFailure (); }}} / *** 시리얼 포트에서 데이터 읽기** @param serialport* 현재 확립 된 연결이있는 시리얼 포트 객체* @데이터 읽기* @throws readdatafromserialportfailure* Serial Port에서 데이터를 읽는 동안 오류가 발생했습니다. readfromport (Serialport Serialport)는 readDataFromserialportFailure, serialportInputStreamCloseFailure {inputStream in = null; 바이트 [] bytes = null; try {in = serialport.getInputStream (); // 버퍼에서 데이터 길이 int를 가져옵니다. bufflenth = in.available (); while (bufflenth! = 0) {// 바이트 배열을 버퍼 바이트의 데이터 길이로 초기화 = 새로운 바이트 [Bufflenth]; in.Read (바이트); bufflenth = in.available (); }} catch (ioexception e) {throw readdatafromserialportfailure (); } 마침내 {try {if (in! = null) {in.close (); in = null; }} catch (ioException e) {throw new serialportInputStreamCloseFailure (); }} 반환 바이트; } / ** * 리스너 추가 * * @param port * Serial Port Object * @param 청취자 * 직렬 포트 리스너 * @throws toomanylistener * toomanylistener * 너무 많은 청취 클래스 개체 * / public static void addlistener (Serialport Port, SerialporteventListener) Throws to Manmannister {// port.addeventListener (리스너); // 데이터가 도착하면 웨이크 업 청취 수신 스레드를 설정합니다. // 통신이 중단 될 때 웨이크 업 인터럽트 스레드를 설정합니다. } catch (toomanylistenersException e) {새로운 TOMONYLISTENERS (); }}}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; java.awt.graphicenvonment; java.awt.event.actionevent; import java.awt.event.actionlistener; import java.util.list; import javax.swing.bordrefactory; import javax.swing.jbutton; import javax.swing.jcombobox; import javax.swing.jframe; javax.swing.jlabel; javax.swing.jpanel; import javax.swing.jscrollpane; import javax.swing.jtextArea; import javax.swing.jtextfield; import com.yang.serialport.exception.nosuchport; import com.yang.serialport.exception.noTaSection; import Com.yang.serialport.sepport.secemence com.yang.serialport.exception.senddatatoserialportfailure; import com.yang.serialport.exception.serialportOutputStreamCloseFailure; import com.yang.serialport.exception.serialportparameterFailure; import com.yang.serialport.exception.tomanylisteners; import com.yang.serialport.manage.serialportmanager; import com.yang.serialport.utils.byteutils; import com.yang.serialport.utils.showutils;/*** 메인 인터페이스** @athor yangle*/public classeframe jframe {/*** 프로그램 인터페이스 폭*/public final int intth intth int int int int int int. / *** 프로그램 인터페이스 높이*/ public static final int height = 360; private jtextArea dataview = new JtextArea (); 개인 jscrollpane scrolldataview = new jscrollpane (dataview); // 직렬 포트 설정 패널 개인 jpanel serialportpanel = new JPanel (); 개인 jlabel serialportlabel = new Jlabel ( "Serial Port"); 개인 jlabel baudratelabel = New Jlabel ( "Baudrate"); 개인 Jcombobox commchoice = 새로운 jcombobox (); 개인 Jcombobox Baudratechoice = New Jcombobox (); // 작동 패널 개인 JPANEL OPERATEPANEL = NEW JPANEL (); private jtextfield datainput = 새로운 jtextfield (); 개인 JBUTTON SERIALPORTOPERATE = NEW JBUTTON ( "Open Serial Port"); private jbutton senddata = new Jbutton ( "데이터 보내기"); 개인 목록 <string> commlist = null; 개인 시리얼 포트 시리얼 포트; public mainframe () {initview (); initcomponents (); ActionListener (); initData (); } private void initView () {// 프로그램을 닫아 setDefaultCloseOperation (javax.swing.windowConstants.exit_on_close); // 금지 창 극대화 setResizable (false); // 프로그램 창을 중심 지점으로 설정합니다. 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 (BorderCactory.CreateTitredBorder ( "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); OperatePanel.setLayout (null); 추가 (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 ( "확인되지 않은") private void initData () {commlist = serialportManager.findport (); // 직렬 포트가 있는지 확인하고 (commlist == null || commlist.size () <1) {showutils.warningMessage ( "유효한 직렬 포트가 발견되지 않았습니다!") if 옵션에 추가하십시오. } else {for (문자열 s : commlist) {commchoice.additem (s); }} baudratechoice.additem ( "9600"); baudratechoice.additem ( "19200"); baudratechoice.additem ( "38400"); baudratechoice.additem ( "57600"); baudratechoice.additem ( "115200"); } private void actionListener () {serialPortOrate.AddActionListener (new ActionListener () {@OverRide public void actionPerformed (actionEvent e) {if ( "열린 Serial Port".Equals (serialPortOperate.getText ()) && SerialPort == NULL) {OpenSerialPort (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.getSeltectedItem (); // 보드 속도를 가져옵니다 int baudrate = 9600; 문자열 bps = (문자열) 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 (serialportParameterFailure 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 ( "열린 직렬 포트"); } / *** 데이터 보내기** @param evt* 클릭 이벤트* / private void senddata (java.awt.event.actionevent evt) {// 입력 상자에 직접 16 진 문자를 입력하십시오. 길이는 문자열 data = datainput.getText (). toString (); try {serialportmanager.sendtoport (serialport, byteutils.hexstr2byte (data)); } catch (sendDatatoSerialportFailure e) {e.printstacktrace (); } catch (serialportOutputStreamCloseFailure e) {e.printstacktrace (); }} private class serialListener는 serialporteventListener를 구현합니다. { / *** 모니터링 된 직렬 포트 이벤트* / public void serialevent (serialportevent serialportevent) {switch (serialportevent.geteventtype ()) {사례 Serialportevent.bi : // 10 Communication Interrupts.errmessage ( "Communication Interial"); 부서지다; case serialportevent.oe : // 7 오버 플로우 (오버 플로우) 오류 case serialportevent.fe : // 9 프레임 오류 case serialportevent.pe : // 8 parity error case serialportevent.cd : // 6 캐리어 감지 사례 serialportevent.cts : // 3 serialportevent.dsr : // 4 Serialportevent.dsr : // 4 thate serialportevent.dsr : // 4 case serialportevent.output_buffer_empty : // 2 출력 버퍼가 깨졌습니다. case serialportevent.data_available : // 1 사용 가능한 데이터는 직렬 포트 바이트 [] 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을 더 지원하기를 바랍니다.