자바 로 직렬 통신 실현
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
학우 들 이 평론 하 는 것 을 환영 합 니 다.만약 당신 이 이 블 로그 가 당신 에 게 유용 하 다 고 생각한다 면,메 시 지 를 남기 거나 대 들 어 보 세 요.
감사합니다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.