不解释了直接贴代码。
(连接的仿真软件,也可以直接连接现实的串口,改一下发送和接收的数据形式就好了)
直接套用会有问题,1、环境配置问题 2、包的问题 3、数据库连接的是我自己数据库
调试了很久,然后在课设和实训中都用到了,主要是要耐心的读程序明白每个模块的功能。个人写的时候也是调了很久的bug,也配置了很多参数。从下java加包,修改代码,采集数据,发送控制命令,连接数据库等。
一些实验中的图片:
1、主程序
package serialPort;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import gnu.io.SerialPort;
import serialException.ExceptionWriter;
/**
* 主程序
* @author zhong
*
*/
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"));
Image background = toolKit.getImage("timg.jpg");
//持有其他类
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("农业节能灌溉项目"); //设置程序标题
// 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.drawImage(background, 0, 0, getWidth(), getHeight(), this);
g.setFont(new Font("", Font.BOLD, 40));
g.setColor(Color.black);
g.drawString("欢迎来到农业节水灌溉监控系统", 40, 280);
g.setFont(new Font("", Font.ITALIC, 26));
g.setColor(Color.BLACK);
g.drawString("Version:3.0 Author By:DeathY", 280, 340);
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) {
//SerialTool.sendToPort(serialPort,"");//关闭排水管
repaint();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
//重画线程出错抛出异常时创建一个Dialog并显示异常详细信息
String err = ExceptionWriter.getErrorInfoFromException(e);
JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);
}
}
}
}
}
2、数据显示以及处理
package serialPort;
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.TextField;
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 java.util.TooManyListenersException;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import USEFULL.Tran;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import serialException.*;
/**
* 监测数据显示类
*/
public class DataView extends Frame {
private static final long serialVersionUID = 1L;
Client client = null;
private List<String> commList = null; // 保存可用端口号
private SerialPort serialPort = null; // 保存串口对象
private controlJDQ JDQ;//
private Smoke smo;
private static Tran tran;
private Font font = new Font("", Font.BOLD, 25);
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
//private long last1=System。currentTimeMillis()
private Label tem = new Label("暂无数据", Label.CENTER); // 温度
private Label hum = new Label("暂无数据", Label.CENTER); // 湿度
private Label pa = new Label("暂无数据", Label.CENTER); // 压强
private Label moke = new Label("一切正常", Label.CENTER); // 雨量
private Label Photo = new Label("暂无数据", Label.CENTER); // 风速
private Label LED = new Label("暂无数据", Label.CENTER); // LED,显示
// JLabel location = new JLabel("地名:");
public TextField temup = new TextField("26℃");
public TextField temdown = new TextField("21℃");
public TextField humup = new TextField("60%");
public TextField humdown = new TextField("40%");
private Choice commChoice = new Choice(); // 串口选择(下拉框)
private Choice bpsChoice = new Choice(); // 波特率选择
private Button openSerialButton = new Button("打开串口");
Image offScreen = null; // 重画时的画布
// 设置window的icon
Toolkit toolKit = getToolkit();
// Image icon = toolKit.getImage(DataView.class.getResource("timg.jpg"));
Image background = toolKit.getImage("1.jpg");
/**
* 类的构造方法
*
* @param client
*/
public DataView(Client client) {
this.client = client;
commList = SerialTool.findPort(); // 程序初始化时就扫描一次有效串口
}
/**
* 主菜单窗口显