使用Java实现串口通信

时间:2019-10-09 03:39来源:编程技术
感谢: Eclipse2.0 Style Plugin Support 摩登版前后相继请查看 《使用Java完成串口通讯》 展开 Help - Install New Software,在【Work with】选项中精选 TheEclipse Project Updates - ,在底下的选项中勾选【

感谢:

图片 1Eclipse 2.0 Style Plugin Support

摩登版前后相继请查看 《使用Java完成串口通讯》

展开 Help -> Install New Software,在【Work with】选项中精选 The Eclipse Project Updates - ,在底下的选项中勾选【Eclipse Tests, Tools,Examples, and Extras】下的【Eclipse 2.0 Style Plugin Support】,然后遵照提醒平素暗许下一步,重启Eclipse:

SerialPortManager达成了对串口通讯的军管,包含查找可用端口、打开关闭串口、发送接收数据。

中华VXTX 正视包下载地址,内含叁拾几个人与陆15个人版本

Java串口通讯依靠的jar包宝马7系XTXcomm.jar下载地址:

重启达成后,再一次张开 Help -> Install New Software,在【Work with】选项中输入 fatjat - ,在底下的选项中勾选,然后根据提醒平昔暗许下一步,重启Eclipse,在品种上右键就可以见到【Build Fat Jar】选项了:

GitHub传送门

SerialPortManager完毕了对串口通信的管住,包罗查找可用端口、展开|关闭串口、发送|接收数据。

本文Demo下载

本文德姆o下载地址:

内含三十二位与陆15人版本选拔办法:拷贝 CRUISERXTXcomm.jar 到 JAVA_HOMEjrelibext目录中;拷贝 rxtxSerial.dll 到 JAVA_HOMEjrebin目录中;拷贝 rxtxParallel.dll 到 JAVA_HOMEjrebin目录中;JAVA_HOME为jdk安装路线

注意:有同学境遇运转程序,报找不到main方法的谬误,检查一下注重包拷贝的渠道是还是不是准确,jdk安装后会生成七个jre目录,要求拷贝到jdk > jre目录下。

选用Java完毕的串口通讯程序,协理十六进制数据的发送与接受。源码下载地址:

正文的串口通讯支出基于奥迪Q5XTX,所以需求引用一些中华VXTX的借助包:

招待同学们戏弄商酌,假诺您感觉本篇博客对你有用,那么就留个言也许点下喜欢吗

修改后的readFromPort方法中央银行使了read方法来判断当前缓冲区中有未有数量,然后把读取到的多寡拼接到一同呈现,方法中本人把每一趟读取的尺寸设置成了1个字节,这几个能够依赖实际供给修改:

新式版前后相继请查看 《使用Java达成串口通讯》

package com.yang.serialport.manager;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.utils.ArrayUtils;import com.yang.serialport.utils.ShowUtils;import gnu.io.CommPort;import gnu.io.CommPortIdentifier;import gnu.io.NoSuchPortException;import gnu.io.PortInUseException;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import gnu.io.UnsupportedCommOperationException;/** * 串口管理 * * @author yangle */@SuppressWarningspublic class SerialPortManager { /** * 查找所有可用端口 * * @return 可用端口名称列表 */ public static final ArrayList<String> findPorts() { // 获得当前所有可用串口 Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers(); ArrayList<String> portNameList = new ArrayList<String>(); // 将可用串口名添加到List并返回该List while (portList.hasMoreElements { String portName = portList.nextElement().getName(); portNameList.add; } return portNameList; } /** * 打开串口 * * @param portName * 端口名称 * @param baudrate * 波特率 * @return 串口对象 * @throws PortInUseException * 串口已被占用 */ public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException { try { // 通过端口名识别端口 CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier; // 打开端口,并给端口名字和一个timeout(打开操作的超时时间) CommPort commPort = portIdentifier.open(portName, 2000); // 判断是不是串口 if (commPort instanceof SerialPort) { SerialPort serialPort = (SerialPort) commPort; try { // 设置一下串口的波特率等参数 // 数据位:8 // 停止位:1 // 校验位:None serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) { e.printStackTrace(); } return serialPort; } } catch (NoSuchPortException e1) { e1.printStackTrace(); } return null; } /** * 关闭串口 * * @param serialport * 待关闭的串口对象 */ public static void closePort(SerialPort serialPort) { if (serialPort != null) { serialPort.close(); } } /** * 往串口发送数据 * * @param serialPort * 串口对象 * @param order * 待发送数据 */ public static void sendToPort(SerialPort serialPort, byte[] order) { OutputStream out = null; try { out = serialPort.getOutputStream(); out.write; out.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); out = null; } } catch (IOException e) { e.printStackTrace(); } } } /** * 从串口读取数据 * * @param serialPort * 当前已建立连接的SerialPort对象 * @return 读取到的数据 */ public static byte[] readFromPort(SerialPort serialPort) { InputStream in = null; byte[] bytes = {}; try { in = serialPort.getInputStream(); // 缓冲区大小为一个字节 byte[] readBuffer = new byte[1]; int bytesNum = in.read(readBuffer); while (bytesNum > 0) { bytes = ArrayUtils.concat(bytes, readBuffer); bytesNum = in.read(readBuffer); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); in = null; } } catch (IOException e) { e.printStackTrace(); } } return bytes; } /** * 添加监听器 * * @param port * 串口对象 * @param listener * 串口存在有效数据监听 */ public static void addListener(SerialPort serialPort, DataAvailableListener listener) { try { // 给串口添加监听器 serialPort.addEventListener(new SerialPortListener); // 设置当有数据到达时唤醒监听接收线程 serialPort.notifyOnDataAvailable; // 设置当通信中断时唤醒中断线程 serialPort.notifyOnBreakInterrupt; } catch (TooManyListenersException e) { e.printStackTrace(); } } /** * 串口监听 */ public static class SerialPortListener implements SerialPortEventListener { private DataAvailableListener mDataAvailableListener; public SerialPortListener(DataAvailableListener mDataAvailableListener) { this.mDataAvailableListener = mDataAvailableListener; } public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType { case SerialPortEvent.DATA_AVAILABLE: // 1.串口存在有效数据 if (mDataAvailableListener != null) { mDataAvailableListener.dataAvailable(); } break; case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2.输出缓冲区已清空 break; case SerialPortEvent.CTS: // 3.清除待发送数据 break; case SerialPortEvent.DSR: // 4.待发送数据准备好了 break; case SerialPortEvent.RI: // 5.振铃指示 break; case SerialPortEvent.CD: // 6.载波检测 break; case SerialPortEvent.OE: // 7.溢位错误 break; case SerialPortEvent.PE: // 8.奇偶校验错误 break; case SerialPortEvent.FE: // 9.帧错误 break; case SerialPortEvent.BI: // 10.通讯中断 ShowUtils.errorMessage("与串口设备通讯中断"); break; default: break; } } } /** * 串口存在有效数据监听 */ public interface DataAvailableListener { /** * 串口存在有效数据 */ void dataAvailable(); }}

图片 2串口通讯

  • 拷贝 RXTXcomm.jar 到 JAVA_HOMEjrelibext目录中;

  • 拷贝 rxtxSerial.dll 到 JAVA_HOMEjrebin目录中;

  • 拷贝 rxtxParallel.dll 到 JAVA_HOMEjrebin目录中;

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; } 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; // 打开端口,设置端口名与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; 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; 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; // 设置当有数据到达时唤醒监听接收线程 port.notifyOnDataAvailable; // 设置当通信中断时唤醒中断线程 port.notifyOnBreakInterrupt; } catch (TooManyListenersException e) { throw new TooManyListeners(); } }}

/* * 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; // 串口设置面板 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; // 设置程序窗口居中显示 Point p = GraphicsEnvironment.getLocalGraphicsEnvironment() .getCenterPoint(); setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT); this.setLayout; setTitle; } private void initComponents() { // 数据显示 dataView.setFocusable; scrollDataView.setBounds(10, 10, 475, 200); add(scrollDataView); // 串口设置 serialPortPanel.setBorder(BorderFactory.createTitledBorder; serialPortPanel.setBounds(10, 220, 170, 100); serialPortPanel.setLayout; add(serialPortPanel); serialPortLabel.setForeground(Color.gray); serialPortLabel.setBounds(10, 25, 40, 20); serialPortPanel.add(serialPortLabel); commChoice.setFocusable; commChoice.setBounds(60, 25, 100, 20); serialPortPanel.add(commChoice); baudrateLabel.setForeground(Color.gray); baudrateLabel.setBounds(10, 60, 40, 20); serialPortPanel.add(baudrateLabel); baudrateChoice.setFocusable; baudrateChoice.setBounds(60, 60, 100, 20); serialPortPanel.add(baudrateChoice); // 操作 operatePanel.setBorder(BorderFactory.createTitledBorder; operatePanel.setBounds(200, 220, 285, 100); operatePanel.setLayout; add(operatePanel); dataInput.setBounds(25, 25, 235, 20); operatePanel.add(dataInput); serialPortOperate.setFocusable; serialPortOperate.setBounds(45, 60, 90, 20); operatePanel.add(serialPortOperate); sendData.setFocusable; sendData.setBounds(155, 60, 90, 20); operatePanel.add; } @SuppressWarnings("unchecked") private void initData() { commList = SerialPortManager.findPort(); // 检查是否有可用串口,有则加入选项中 if (commList == null || commList.size { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { for (String s : commList) { commChoice.addItem; } } baudrateChoice.addItem; baudrateChoice.addItem; baudrateChoice.addItem; baudrateChoice.addItem; baudrateChoice.addItem; } private void actionListener() { serialPortOperate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ("打开串口".equals(serialPortOperate.getText && serialport == null) { openSerialPort; } else { closeSerialPort; } } }); sendData.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendData; } /** * 打开串口 * * @param evt * 点击事件 */ private void openSerialPort(java.awt.event.ActionEvent evt) { // 获取串口名称 String commName =  commChoice.getSelectedItem(); // 获取波特率 int baudrate = 9600; String bps =  baudrateChoice.getSelectedItem(); baudrate = Integer.parseInt; // 检查串口名称是否获取正确 if (commName == null || commName.equals { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { try { serialport = SerialPortManager.openPort(commName, baudrate); if (serialport != null) { dataView.setText("串口已打开" + "rn"); 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("串口已关闭" + "rn"); serialPortOperate.setText; } /** * 发送数据 * * @param evt * 点击事件 */ private void sendData(java.awt.event.ActionEvent evt) { // 输入框直接输入十六进制字符,长度必须是偶数 String data = dataInput.getText().toString(); try { SerialPortManager.sendToPort(serialport, ByteUtils.hexStr2Byte; } 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) + "rn"); } } catch (Exception e) { ShowUtils.errorMessage(e.toString; // 发生读取错误时显示错误信息后退出系统 System.exit; } break; } } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MainFrame().setVisible; } }); }}

先看下效果:

追加了数据格式设置作用,可采取ASCII或Hex,那也是汇报最多的难题。

图片 3 FatJar

当采取以十六进制的花样发送和接收数据时,扩张了对奇数位数据的辅助,比方输入1,会自行补齐为01殡葬。

JAVA_HOME为jdk安装路线

关键看下readFromPort方法,上一版的readFromPort方法是透过InputStream中的available方法来判断当前缓冲区中有未有数据的,而available方法重返的是未曾被阻断的字节数,那就恐怕会变成接收到的数目不完全。

/** * 从串口读取数据 * * @param serialPort * 当前已建立连接的SerialPort对象 * @return 读取到的数据 */public static byte[] readFromPort(SerialPort serialPort) { InputStream in = null; byte[] bytes = {}; try { in = serialPort.getInputStream(); // 缓冲区大小为一个字节 byte[] readBuffer = new byte[1]; int bytesNum = in.read(readBuffer); while (bytesNum > 0) { bytes = ArrayUtils.concat(bytes, readBuffer); bytesNum = in.read(readBuffer); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) { in.close(); in = null; } } catch (IOException e) { e.printStackTrace(); } } return bytes;}

package com.yang.serialport.ui;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.ButtonGroup;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JRadioButton;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.event.PopupMenuEvent;import javax.swing.event.PopupMenuListener;import com.yang.serialport.manager.SerialPortManager;import com.yang.serialport.utils.ByteUtils;import com.yang.serialport.utils.ShowUtils;import gnu.io.PortInUseException;import gnu.io.SerialPort;/** * 主界面 * * @author yangle */@SuppressWarningspublic class MainFrame extends JFrame { // 程序界面宽度 public final int WIDTH = 530; // 程序界面高度 public final int HEIGHT = 390; // 数据显示区 private JTextArea mDataView = new JTextArea(); private JScrollPane mScrollDataView = new JScrollPane(mDataView); // 串口设置面板 private JPanel mSerialPortPanel = new JPanel(); private JLabel mSerialPortLabel = new JLabel; private JLabel mBaudrateLabel = new JLabel; private JComboBox mCommChoice = new JComboBox(); private JComboBox mBaudrateChoice = new JComboBox(); private ButtonGroup mDataChoice = new ButtonGroup(); private JRadioButton mDataASCIIChoice = new JRadioButton("ASCII", true); private JRadioButton mDataHexChoice = new JRadioButton; // 操作面板 private JPanel mOperatePanel = new JPanel(); private JTextArea mDataInput = new JTextArea(); private JButton mSerialPortOperate = new JButton; private JButton mSendData = new JButton; // 串口列表 private List<String> mCommList = null; // 串口对象 private SerialPort mSerialport; public MainFrame() { initView(); initComponents(); actionListener(); initData(); } /** * 初始化窗口 */ private void initView() { // 关闭程序 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); // 禁止窗口最大化 setResizable; // 设置程序窗口居中显示 Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint(); setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT); this.setLayout; setTitle; } /** * 初始化控件 */ private void initComponents() { // 数据显示 mDataView.setFocusable; mScrollDataView.setBounds(10, 10, 505, 200); add(mScrollDataView); // 串口设置 mSerialPortPanel.setBorder(BorderFactory.createTitledBorder; mSerialPortPanel.setBounds(10, 220, 170, 130); mSerialPortPanel.setLayout; add(mSerialPortPanel); mSerialPortLabel.setForeground(Color.gray); mSerialPortLabel.setBounds(10, 25, 40, 20); mSerialPortPanel.add(mSerialPortLabel); mCommChoice.setFocusable; mCommChoice.setBounds(60, 25, 100, 20); mSerialPortPanel.add(mCommChoice); mBaudrateLabel.setForeground(Color.gray); mBaudrateLabel.setBounds(10, 60, 40, 20); mSerialPortPanel.add(mBaudrateLabel); mBaudrateChoice.setFocusable; mBaudrateChoice.setBounds(60, 60, 100, 20); mSerialPortPanel.add(mBaudrateChoice); mDataASCIIChoice.setBounds(20, 95, 55, 20); mDataHexChoice.setBounds(95, 95, 55, 20); mDataChoice.add(mDataASCIIChoice); mDataChoice.add(mDataHexChoice); mSerialPortPanel.add(mDataASCIIChoice); mSerialPortPanel.add(mDataHexChoice); // 操作 mOperatePanel.setBorder(BorderFactory.createTitledBorder; mOperatePanel.setBounds(200, 220, 315, 130); mOperatePanel.setLayout; add(mOperatePanel); mDataInput.setBounds(25, 25, 265, 50); mDataInput.setLineWrap; mDataInput.setWrapStyleWord; mOperatePanel.add(mDataInput); mSerialPortOperate.setFocusable; mSerialPortOperate.setBounds(45, 95, 90, 20); mOperatePanel.add(mSerialPortOperate); mSendData.setFocusable; mSendData.setBounds(180, 95, 90, 20); mOperatePanel.add(mSendData); } /** * 初始化数据 */ private void initData() { mCommList = SerialPortManager.findPorts(); // 检查是否有可用串口,有则加入选项中 if (mCommList == null || mCommList.size { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { for (String s : mCommList) { mCommChoice.addItem; } } mBaudrateChoice.addItem; mBaudrateChoice.addItem; mBaudrateChoice.addItem; mBaudrateChoice.addItem; mBaudrateChoice.addItem; } /** * 按钮监听事件 */ private void actionListener() { // 串口 mCommChoice.addPopupMenuListener(new PopupMenuListener() { @Override public void popupMenuWillBecomeVisible(PopupMenuEvent e) { mCommList = SerialPortManager.findPorts(); // 检查是否有可用串口,有则加入选项中 if (mCommList == null || mCommList.size { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { int index = mCommChoice.getSelectedIndex(); mCommChoice.removeAllItems(); for (String s : mCommList) { mCommChoice.addItem; } mCommChoice.setSelectedIndex; } } @Override public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { // NO OP } @Override public void popupMenuCanceled(PopupMenuEvent e) { // NO OP } }); // 打开|关闭串口 mSerialPortOperate.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ("打开串口".equals(mSerialPortOperate.getText && mSerialport == null) { openSerialPort; } else { closeSerialPort; } } }); // 发送数据 mSendData.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { sendData; } /** * 打开串口 * * @param evt * 点击事件 */ private void openSerialPort(java.awt.event.ActionEvent evt) { // 获取串口名称 String commName =  mCommChoice.getSelectedItem(); // 获取波特率,默认为9600 int baudrate = 9600; String bps =  mBaudrateChoice.getSelectedItem(); baudrate = Integer.parseInt; // 检查串口名称是否获取正确 if (commName == null || commName.equals { ShowUtils.warningMessage("没有搜索到有效串口!"); } else { try { mSerialport = SerialPortManager.openPort(commName, baudrate); if (mSerialport != null) { mDataView.setText("串口已打开" + "rn"); mSerialPortOperate.setText; } } catch (PortInUseException e) { ShowUtils.warningMessage("串口已被占用!"); } } // 添加串口监听 SerialPortManager.addListener(mSerialport, new SerialPortManager.DataAvailableListener() { @Override public void dataAvailable() { byte[] data = null; try { if (mSerialport == null) { ShowUtils.errorMessage("串口对象为空,监听失败!"); } else { // 读取串口数据 data = SerialPortManager.readFromPort(mSerialport); // 以字符串的形式接收数据 if (mDataASCIIChoice.isSelected { mDataView.append(new String + "rn"); } // 以十六进制的形式接收数据 if (mDataHexChoice.isSelected { mDataView.append(ByteUtils.byteArrayToHexString + "rn"); } } } catch (Exception e) { ShowUtils.errorMessage(e.toString; // 发生读取错误时显示错误信息后退出系统 System.exit; } } }); } /** * 关闭串口 * * @param evt * 点击事件 */ private void closeSerialPort(java.awt.event.ActionEvent evt) { SerialPortManager.closePort(mSerialport); mDataView.setText("串口已关闭" + "rn"); mSerialPortOperate.setText; mSerialport = null; } /** * 发送数据 * * @param evt * 点击事件 */ private void sendData(java.awt.event.ActionEvent evt) { // 待发送数据 String data = mDataInput.getText().toString(); if (mSerialport == null) { ShowUtils.warningMessage("请先打开串口!"); return; } if ("".equals || data == null) { ShowUtils.warningMessage("请输入要发送的数据!"); return; } // 以字符串的形式发送数据 if (mDataASCIIChoice.isSelected { SerialPortManager.sendToPort(mSerialport, data.getBytes; } // 以十六进制的形式发送数据 if (mDataHexChoice.isSelected { SerialPortManager.sendToPort(mSerialport, ByteUtils.hexStr2Byte; } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new MainFrame().setVisible; } }); }}

卷入的时候境遇的标题,和串口通讯非亲非故,有的同学或者会境遇一样的题材,在那边说下,新装了贰个Eclipse 4.7.3版本,开掘本地安装FatJar的时候一向安装不上,网上查了下说FatJar不帮助Eclipse 3.4后头的本子,能够经过上边包车型大巴艺术进行安装:

图片 4串口通讯

相差上一篇小说《使用Java落成串口通讯》已经去世快四年的时刻了,在此时期收到了大多读者的陈说,很欢欣能够扶持到那般多少人,依据收到的申报,作者对代码逻辑实行了优化整治,并扩大了一部分新职能,在此记录下,分享给大家。

编辑:编程技术 本文来源:使用Java实现串口通信

关键词: