houyouliang / security

安全
0 stars 0 forks source link

串口读写 #4

Open houyouliang opened 7 years ago

houyouliang commented 7 years ago

package com.usb.usbtest;

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.TooManyListenersException;

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;

public class SerialTool { private SerialTool() { }

private static class SerialToolHandler {
    private static SerialTool INSTANCE = new SerialTool();
}

public SerialTool newInstance() {
    return SerialToolHandler.INSTANCE;
}

/**
 * 查找可用端口
 */
public static final List<String> findPort() {
    Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();
    List<String> portNameList = new ArrayList<>();
    while (portList.hasMoreElements()) {
        String portName = portList.nextElement().getName();
        portNameList.add(portName);
    }
    return portNameList;
}

/**
 * 打开串口
 * 
 * @throws NoSuchPortException
 * @throws PortInUseException
 */
public static final SerialPort openPort(String portName, int baudrate)
        throws NoSuchPortException, PortInUseException {
    // 通过端口名识别端口
    CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
    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) {
            e.printStackTrace();
        }
        return serialPort;
    } else {
        return null;
    }

}

/**
 * 关闭串口
 * 
 * @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) {

    OutputStream out = null;

    try {

        out = serialPort.getOutputStream();
        out.write(order);
        out.flush();

    } catch (IOException e) {
        System.out.println(e.getMessage());
    } finally {
        try {
            if (out != null) {
                out.close();
                out = null;
            }
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }
}

/**
 * 从串口读取数据
 * @param serialPort 当前已建立连接的SerialPort对象
 * @return 读取到的数据
 * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错
 * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
 */
public static byte[] readFromPort(SerialPort serialPort) {

    InputStream in = null;
    byte[] bytes = null;

    try {

        in = serialPort.getInputStream();
        int bufflenth = in.available();        //获取buffer里的数据长度

        while (bufflenth != 0) {                             
            bytes = new byte[bufflenth];    //初始化byte数组为buffer中数据的长度
            in.read(bytes);
            bufflenth = in.available();
        } 
    } catch (IOException e) {
       System.out.println(e.getMessage());
    } finally {
        try {
            if (in != null) {
                in.close();
                in = null;
            }
        } catch(IOException e) {
            System.out.println(e.getMessage());
        }

    }

    return bytes;

}

/**
 * 添加监听器
 * @param port     串口对象
 * @param listener 串口监听器
 * @throws TooManyListeners 监听类对象过多
 */
public static void addListener(SerialPort port, SerialPortEventListener listener) {

    try {

        //给串口添加监听器
        port.addEventListener(listener);
        //设置当有数据到达时唤醒监听接收线程
        port.notifyOnDataAvailable(true);
      //设置当通信中断时唤醒中断线程
        port.notifyOnBreakInterrupt(true);

    } catch (TooManyListenersException e) {
        System.out.println(e.getMessage());
    }
}

}

houyouliang commented 7 years ago

package com.usb.usbtest;

import java.awt.Button; import java.awt.Choice; import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.Label; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.List;

import javax.swing.JOptionPane;

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

/**

}

houyouliang commented 7 years ago

package com.usb.usbtest;

import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;

import javax.swing.JOptionPane;

public class Client extends Frame{

/**
 * 
 */
private static final long serialVersionUID = 1L;

/**
 * 程序界面宽度
 */
public static final int WIDTH = 800;

/**
 * 程序界面高度
 */
public static final int HEIGHT = 620;

/**
 * 程序界面出现位置(横坐标)
 */
public static final int LOC_X = 200;

/**
 * 程序界面出现位置(纵坐标)
 */
public static final int LOC_Y = 70;

Color color = Color.WHITE; 
Image offScreen = null;    //用于双缓冲

//设置window的icon(这里我自定义了一下Windows窗口的icon图标,因为实在觉得哪个小咖啡图标不好看 = =)

// Toolkit toolKit = getToolkit(); //Image icon = toolKit.getImage(Client.class.getResource("computer.png"));

//持有其他类
DataView dataview = new DataView(this);    //主界面类(显示监控数据主面板)

/**
 * 主方法
 * @param args    //
 */
public static void main(String[] args) {
    new Client().launchFrame();    
}

/**
 * 显示主界面
 */
public void launchFrame() {
    this.setBounds(LOC_X, LOC_Y, WIDTH, HEIGHT);    //设定程序在桌面出现的位置
    this.setTitle("CDIO工程项目");    //设置程序标题
    //this.setIconImage(icon);
    this.setBackground(Color.white);    //设置背景色

    this.addWindowListener(new WindowAdapter() {
        //添加对窗口状态的监听
        public void windowClosing(WindowEvent arg0) {
            //当窗口关闭时
            System.exit(0);    //退出程序
        }

    });

    this.addKeyListener(new KeyMonitor());    //添加键盘监听器
    this.setResizable(false);    //窗口大小不可更改
    this.setVisible(true);    //显示窗口

    new Thread(new RepaintThread()).start();    //开启重画线程
}

/**
 * 画出程序界面各组件元素
 */
public void paint(Graphics g) {
    Color c = g.getColor();

    g.setFont(new Font("微软雅黑", Font.BOLD, 40));
    g.setColor(Color.black);
    g.drawString("欢迎使用上位机实时监控系统", 45, 190);

    g.setFont(new Font("微软雅黑", Font.ITALIC, 26));
    g.setColor(Color.BLACK);
    g.drawString("Version:1.0   Powered By:ZhongLei", 280, 260);

    g.setFont(new Font("微软雅黑", Font.BOLD, 30));
    g.setColor(color);
    g.drawString("————点击Enter键进入主界面————", 100, 480);
    //使文字 "————点击Enter键进入主界面————" 黑白闪烁
    if (color == Color.WHITE)    color = Color.black;
    else if (color == color.BLACK)    color = Color.white;

}

/**
 * 双缓冲方式重画界面各元素组件
 */
public void update(Graphics g) {
    if (offScreen == null)    offScreen = this.createImage(WIDTH, HEIGHT);
    Graphics gOffScreen = offScreen.getGraphics();
    Color c = gOffScreen.getColor();
    gOffScreen.setColor(Color.white);
    gOffScreen.fillRect(0, 0, WIDTH, HEIGHT);    //重画背景画布
    this.paint(gOffScreen);    //重画界面元素
    gOffScreen.setColor(c);
    g.drawImage(offScreen, 0, 0, null);    //将新画好的画布“贴”在原画布上
}

/*
 * 内部类形式实现对键盘事件的监听
 */
private class KeyMonitor extends KeyAdapter {

    public void keyReleased(KeyEvent e) {
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_ENTER) {    //当监听到用户敲击键盘enter键后执行下面的操作
            setVisible(false);    //隐去欢迎界面
            dataview.setVisible(true);    //显示监测界面
            dataview.dataFrame();    //初始化监测界面
        }
    }

}

/*
 * 重画线程(每隔250毫秒重画一次)
 */
private class RepaintThread implements Runnable {
    public void run() {
        while(true) {
            repaint();
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                //重画线程出错抛出异常时创建一个Dialog并显示异常详细信息
                String err = e.getMessage();
                JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.INFORMATION_MESSAGE);
                System.exit(0);
            }
        }
    }

}

}

houyouliang commented 7 years ago

RXTXcomm.jar 需要jar