자바 로 직렬 통신 실현

16851 단어 자바직렬 통신
본 논문 의 사례 는 자바 가 직렬 통신 을 실현 하 는 구체 적 인 코드 를 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.소개
자바 에서 실 현 된 직렬 통신 프로그램 을 사용 하여 16 진 데이터 의 전송 과 수신 을 지원 합 니 다.
원본 코드:SerialPortDemo
효과 도 는 다음 과 같다.

2.RXTXcomm
자바 직렬 통신 의존 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 디 렉 터 리 중;
rxtx Parallel.dll 을 JAVA 로 복사 합 니 다.HOME\jre\bin 디 렉 터 리 중;
JAVA_HOME jdk 설치 경로
3.직렬 통신 관리
SerialPortManager 는 직렬 통신 에 대한 관 리 를 실 현 했 습 니 다.사용 가능 한 포트 를 찾 거나 직렬 포트 를 닫 거나 수신 데 이 터 를 보 내 는 것 을 포함 합 니 다.

package 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.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import 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.exception.NoSuchPort;
import com.yang.serialport.exception.NotASerialPort;
import com.yang.serialport.exception.PortInUse;
import com.yang.serialport.exception.ReadDataFromSerialPortFailure;
import com.yang.serialport.exception.SendDataToSerialPortFailure;
import com.yang.serialport.exception.SerialPortInputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortParameterFailure;
import com.yang.serialport.exception.TooManyListeners;

/**
 *     
 * 
 * @author yangle
 */
public class SerialPortManager {

 /**
 *         
 * 
 * @return         
 */
 @SuppressWarnings("unchecked")
 public static final ArrayList<String> findPort() {
 //           
 Enumeration<CommPortIdentifier> portList = CommPortIdentifier
  .getPortIdentifiers();
 ArrayList<String> portNameList = new ArrayList<String>();
 //          List    List
 while (portList.hasMoreElements()) {
  String portName = portList.nextElement().getName();
  portNameList.add(portName);
 }
 return portNameList;
 }

 /**
 *     
 * 
 * @param portName
 *      
 * @param baudrate
 *     
 * @return     
 * @throws SerialPortParameterFailure
 *          
 * @throws NotASerialPort
 *              
 * @throws NoSuchPort
 *              
 * @throws PortInUse
 *        
 */
 public static final SerialPort openPort(String portName, int baudrate)
  throws SerialPortParameterFailure, NotASerialPort, NoSuchPort,
  PortInUse {
 try {
  //          
  CommPortIdentifier portIdentifier = CommPortIdentifier
   .getPortIdentifier(portName);
  //     ,      timeout(         )
  CommPort commPort = portIdentifier.open(portName, 2000);
  //        
  if (commPort instanceof SerialPort) {
  SerialPort serialPort = (SerialPort) commPort;
  try {
   //            
   serialPort.setSerialPortParams(baudrate,
    SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE);
  } catch (UnsupportedCommOperationException e) {
   throw new SerialPortParameterFailure();
  }
  return serialPort;
  } else {
  //     
  throw new 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
 *      
 * @param order
 *       
 * @throws SendDataToSerialPortFailure
 *           
 * @throws SerialPortOutputStreamCloseFailure
 *              
 */
 public static void sendToPort(SerialPort serialPort, byte[] order)
  throws SendDataToSerialPortFailure,
  SerialPortOutputStreamCloseFailure {
 OutputStream out = null;
 try {
  out = serialPort.getOutputStream();
  out.write(order);
  out.flush();
 } catch (IOException e) {
  throw new SendDataToSerialPortFailure();
 } finally {
  try {
  if (out != null) {
   out.close();
   out = null;
  }
  } catch (IOException e) {
  throw new SerialPortOutputStreamCloseFailure();
  }
 }
 }

 /**
 *        
 * 
 * @param serialPort
 *          SerialPort  
 * @return       
 * @throws ReadDataFromSerialPortFailure
 *            
 * @throws SerialPortInputStreamCloseFailure
 *             
 */
 public static byte[] readFromPort(SerialPort serialPort)
  throws ReadDataFromSerialPortFailure,
  SerialPortInputStreamCloseFailure {
 InputStream in = null;
 byte[] bytes = null;
 try {
  in = serialPort.getInputStream();
  //   buffer      
  int bufflenth = in.available();
  while (bufflenth != 0) {
  //    byte   buffer      
  bytes = new byte[bufflenth];
  in.read(bytes);
  bufflenth = in.available();
  }
 } catch (IOException e) {
  throw new ReadDataFromSerialPortFailure();
 } finally {
  try {
  if (in != null) {
   in.close();
   in = null;
  }
  } catch (IOException e) {
  throw new SerialPortInputStreamCloseFailure();
  }
 }
 return bytes;
 }

 /**
 *      
 * 
 * @param port
 *      
 * @param listener
 *       
 * @throws TooManyListeners
 *         
 */
 public static void addListener(SerialPort port,
  SerialPortEventListener listener) throws TooManyListeners {
 try {
  //         
  port.addEventListener(listener);
  //                  
  port.notifyOnDataAvailable(true);
  //               
  port.notifyOnBreakInterrupt(true);
 } catch (TooManyListenersException e) {
  throw new TooManyListeners();
 }
 }
}
4.프로그램 주 창

/*
 * MainFrame.java
 *
 * Created on 2016.8.19
 */

package com.yang.serialport.ui;

import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;

import java.awt.Color;
import java.awt.GraphicsEnvironment;
import 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.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import 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.NotASerialPort;
import com.yang.serialport.exception.PortInUse;
import com.yang.serialport.exception.SendDataToSerialPortFailure;
import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;
import com.yang.serialport.exception.SerialPortParameterFailure;
import com.yang.serialport.exception.TooManyListeners;
import com.yang.serialport.manage.SerialPortManager;
import com.yang.serialport.utils.ByteUtils;
import com.yang.serialport.utils.ShowUtils;

/**
 *    
 * 
 * @author yangle
 */
public class MainFrame extends JFrame {

 /**
 *       
 */
 public static final int WIDTH = 500;

 /**
 *       
 */
 public static final int HEIGHT = 360;

 private JTextArea dataView = new JTextArea();
 private JScrollPane scrollDataView = new JScrollPane(dataView);

 //       
 private JPanel serialPortPanel = new JPanel();
 private JLabel serialPortLabel = new JLabel("  ");
 private JLabel baudrateLabel = new JLabel("   ");
 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("    ");
 private JButton sendData = new JButton("    ");

 private List<String> commList = null;
 private SerialPort serialport;

 public MainFrame() {
 initView();
 initComponents();
 actionListener();
 initData();
 }

 private void initView() {
 //     
 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
 //        
 setResizable(false);

 //           
 Point p = GraphicsEnvironment.getLocalGraphicsEnvironment()
  .getCenterPoint();
 setBounds(p.x - WIDTH / 2, p.y - 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("    "));
 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.setBorder(BorderFactory.createTitledBorder("  "));
 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();
 //          ,       
 if (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 ("    ".equals(serialPortOperate.getText())
   && serialport == null) {
   openSerialPort(e);
  } else {
   closeSerialPort(e);
  }
  }
 });

 sendData.addActionListener(new ActionListener() {

  @Override
  public void actionPerformed(ActionEvent e) {
  sendData(e);
  }
 });
 }

 /**
 *     
 * 
 * @param evt
 *      
 */
 private void openSerialPort(java.awt.event.ActionEvent evt) {
 //       
 String commName = (String) commChoice.getSelectedItem();
 //      
 int baudrate = 9600;
 String bps = (String) baudrateChoice.getSelectedItem();
 baudrate = Integer.parseInt(bps);

 //             
 if (commName == null || commName.equals("")) {
  ShowUtils.warningMessage("         !");
 } else {
  try {
  serialport = SerialPortManager.openPort(commName, baudrate);
  if (serialport != null) {
   dataView.setText("     " + "\r
"); serialPortOperate.setText(" "); } } catch (SerialPortParameterFailure e) { e.printStackTrace(); } catch (NotASerialPort 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
"); serialPortOperate.setText(" "); } /** * * * @param evt * */ private void sendData(java.awt.event.ActionEvent evt) { // , String data = dataInput.getText().toString(); try { SerialPortManager.sendToPort(serialport, ByteUtils.hexStr2Byte(data)); } catch (SendDataToSerialPortFailure e) { e.printStackTrace(); } catch (SerialPortOutputStreamCloseFailure e) { e.printStackTrace(); } } private class SerialListener implements SerialPortEventListener { /** * */ public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType()) { case SerialPortEvent.BI: // 10 ShowUtils.errorMessage(" "); break; case SerialPortEvent.OE: // 7 ( ) case SerialPortEvent.FE: // 9 case SerialPortEvent.PE: // 8 case SerialPortEvent.CD: // 6 case SerialPortEvent.CTS: // 3 case SerialPortEvent.DSR: // 4 case SerialPortEvent.RI: // 5 case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 break; case SerialPortEvent.DATA_AVAILABLE: // 1 byte[] data = null; try { if (serialport == null) { ShowUtils.errorMessage(" ! !"); } else { // data = SerialPortManager.readFromPort(serialport); dataView.append(ByteUtils.byteArrayToHexString(data, true) + "\r
"); } } catch (Exception e) { ShowUtils.errorMessage(e.toString()); // System.exit(0); } break; } } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MainFrame().setVisible(true); } }); } }
5.마지막 에 쓴다
원본 다운로드 주소:SerialPortDemo
학우 들 이 평론 하 는 것 을 환영 합 니 다.만약 당신 이 이 블 로그 가 당신 에 게 유용 하 다 고 생각한다 면,메 시 지 를 남기 거나 대 들 어 보 세 요.
감사합니다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기