java 串口 jar_使用Java实现简单串口通信

packageserialPort;importjava.awt.Button;importjava.awt.Choice;importjava.awt.Color;importjava.awt.Font;importjava.awt.Frame;importjava.awt.Graphics;importjava.awt.Image;importjava.awt.Label;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.util.List;importjava.util.TooManyListenersException;importjavax.swing.JOptionPane;importgnu.io.SerialPort;importgnu.io.SerialPortEvent;importgnu.io.SerialPortEventListener;import serialException.*;/*** 监测数据显示类

*@authorZhong

**/

public class DataView extendsFrame {/****/

private static final long serialVersionUID = 1L;

Client client= null;private List commList = null; //保存可用端口号

private SerialPort serialPort = null; //保存串口对象

private Font font = new Font("微软雅黑", Font.BOLD, 25);private Label tem = new Label("暂无数据", Label.CENTER); //温度

private Label hum = new Label("暂无数据", Label.CENTER); //湿度

private Label pa = new Label("暂无数据", Label.CENTER); //压强

private Label rain = new Label("暂无数据", Label.CENTER); //雨量

private Label win_sp = new Label("暂无数据", Label.CENTER); //风速

private Label win_dir = new Label("暂无数据", Label.CENTER); //风向

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("computer.png"));/*** 类的构造方法

*@paramclient*/

publicDataView(Client client) {this.client =client;

commList= SerialTool.findPort(); //程序初始化时就扫描一次有效串口

}/*** 主菜单窗口显示;

* 添加Label、按钮、下拉条及相关事件监听;*/

public voiddataFrame() {this.setBounds(client.LOC_X, client.LOC_Y, client.WIDTH, client.HEIGHT);this.setTitle("CDIO工程项目");this.setIconImage(icon);this.setBackground(Color.white);this.setLayout(null);this.addWindowListener(newWindowAdapter() {public voidwindowClosing(WindowEvent arg0) {if (serialPort != null) {//程序退出时关闭串口释放资源

SerialTool.closePort(serialPort);

}

System.exit(0);

}

});

tem.setBounds(140, 103, 225, 50);

tem.setBackground(Color.black);

tem.setFont(font);

tem.setForeground(Color.white);

add(tem);

hum.setBounds(520, 103, 225, 50);

hum.setBackground(Color.black);

hum.setFont(font);

hum.setForeground(Color.white);

add(hum);

pa.setBounds(140, 193, 225, 50);

pa.setBackground(Color.black);

pa.setFont(font);

pa.setForeground(Color.white);

add(pa);

rain.setBounds(520, 193, 225, 50);

rain.setBackground(Color.black);

rain.setFont(font);

rain.setForeground(Color.white);

add(rain);

win_sp.setBounds(140, 283, 225, 50);

win_sp.setBackground(Color.black);

win_sp.setFont(font);

win_sp.setForeground(Color.white);

add(win_sp);

win_dir.setBounds(520, 283, 225, 50);

win_dir.setBackground(Color.black);

win_dir.setFont(font);

win_dir.setForeground(Color.white);

add(win_dir);//添加串口选择选项

commChoice.setBounds(160, 397, 200, 200);//检查是否有可用串口,有则加入选项中

if (commList == null || commList.size()<1) {

JOptionPane.showMessageDialog(null, "没有搜索到有效串口!", "错误", JOptionPane.INFORMATION_MESSAGE);

}else{for(String s : commList) {

commChoice.add(s);

}

}

add(commChoice);//添加波特率选项

bpsChoice.setBounds(526, 396, 200, 200);

bpsChoice.add("1200");

bpsChoice.add("2400");

bpsChoice.add("4800");

bpsChoice.add("9600");

bpsChoice.add("14400");

bpsChoice.add("19200");

bpsChoice.add("115200");

add(bpsChoice);//添加打开串口按钮

openSerialButton.setBounds(250, 490, 300, 50);

openSerialButton.setBackground(Color.lightGray);

openSerialButton.setFont(new Font("微软雅黑", Font.BOLD, 20));

openSerialButton.setForeground(Color.darkGray);

add(openSerialButton);//添加打开串口按钮的事件监听

openSerialButton.addActionListener(newActionListener() {public voidactionPerformed(ActionEvent e) {//获取串口名称

String commName =commChoice.getSelectedItem();//获取波特率

String bpsStr =bpsChoice.getSelectedItem();//检查串口名称是否获取正确

if (commName == null || commName.equals("")) {

JOptionPane.showMessageDialog(null, "没有搜索到有效串口!", "错误", JOptionPane.INFORMATION_MESSAGE);

}else{//检查波特率是否获取正确

if (bpsStr == null || bpsStr.equals("")) {

JOptionPane.showMessageDialog(null, "波特率获取错误!", "错误", JOptionPane.INFORMATION_MESSAGE);

}else{//串口名、波特率均获取正确时

int bps =Integer.parseInt(bpsStr);try{//获取指定端口名及波特率的串口对象

serialPort =SerialTool.openPort(commName, bps);//在该串口对象上添加监听器

SerialTool.addListener(serialPort, newSerialListener());//监听成功进行提示

JOptionPane.showMessageDialog(null, "监听成功,稍后将显示监测数据!", "提示", JOptionPane.INFORMATION_MESSAGE);

}catch (SerialPortParameterFailure | NotASerialPort | NoSuchPort | PortInUse |TooManyListeners e1) {//发生错误时使用一个Dialog提示具体的错误信息

JOptionPane.showMessageDialog(null, e1, "错误", JOptionPane.INFORMATION_MESSAGE);

}

}

}

}

});this.setResizable(false);new Thread(new RepaintThread()).start(); //启动重画线程

}/*** 画出主界面组件元素*/

public voidpaint(Graphics g) {

Color c=g.getColor();

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 温度: ", 45, 130);

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 湿度: ", 425, 130);

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 压强: ", 45, 220);

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 雨量: ", 425, 220);

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 风速: ", 45, 310);

g.setColor(Color.black);

g.setFont(new Font("微软雅黑", Font.BOLD, 25));

g.drawString(" 风向: ", 425, 310);

g.setColor(Color.gray);

g.setFont(new Font("微软雅黑", Font.BOLD, 20));

g.drawString(" 串口选择: ", 45, 410);

g.setColor(Color.gray);

g.setFont(new Font("微软雅黑", Font.BOLD, 20));

g.drawString(" 波特率: ", 425, 410);

}/*** 双缓冲方式重画界面各元素组件*/

public voidupdate(Graphics g) {if (offScreen == null) offScreen = this.createImage(Client.WIDTH, Client.HEIGHT);

Graphics gOffScreen=offScreen.getGraphics();

Color c=gOffScreen.getColor();

gOffScreen.setColor(Color.white);

gOffScreen.fillRect(0, 0, Client.WIDTH, Client.HEIGHT); //重画背景画布

this.paint(gOffScreen); //重画界面元素

gOffScreen.setColor(c);

g.drawImage(offScreen,0, 0, null); //将新画好的画布“贴”在原画布上

}/** 重画线程(每隔30毫秒重画一次)*/

private class RepaintThread implementsRunnable {public voidrun() {while(true) {//调用重画方法

repaint();//扫描可用串口

commList =SerialTool.findPort();if (commList != null && commList.size()>0) {//添加新扫描到的可用串口

for(String s : commList) {//该串口名是否已存在,初始默认为不存在(在commList里存在但在commChoice里不存在,则新添加)

boolean commExist = false;for (int i=0; i

commExist = true;break;

}

}if(commExist) {//当前扫描到的串口名已经在初始扫描时存在,直接进入下一次循环

continue;

}else{//若不存在则添加新串口名至可用串口下拉列表

commChoice.add(s);

}

}//移除已经不可用的串口

for (int i=0; i

boolean commNotExist = true;for(String s : commList) {if(s.equals(commChoice.getItem(i))) {

commNotExist= false;break;

}

}if(commNotExist) {//System.out.println("remove" + commChoice.getItem(i));

commChoice.remove(i);

}else{continue;

}

}

}else{//如果扫描到的commList为空,则移除所有已有串口

commChoice.removeAll();

}try{

Thread.sleep(30);

}catch(InterruptedException e) {

String err=ExceptionWriter.getErrorInfoFromException(e);

JOptionPane.showMessageDialog(null, err, "错误", JOptionPane.INFORMATION_MESSAGE);

System.exit(0);

}

}

}

}/*** 以内部类形式创建一个串口监听类

*@authorzhong

**/

private class SerialListener implementsSerialPortEventListener {/*** 处理监控到的串口事件*/

public voidserialEvent(SerialPortEvent serialPortEvent) {switch(serialPortEvent.getEventType()) {case SerialPortEvent.BI: //10 通讯中断

JOptionPane.showMessageDialog(null, "与串口设备通讯中断", "错误", JOptionPane.INFORMATION_MESSAGE);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 串口存在可用数据//System.out.println("found data");

byte[] data = null;try{if (serialPort == null) {

JOptionPane.showMessageDialog(null, "串口对象为空!监听失败!", "错误", JOptionPane.INFORMATION_MESSAGE);

}else{

data= SerialTool.readFromPort(serialPort); //读取数据,存入字节数组//System.out.println(new String(data));

// 自定义解析过程,你在实际使用过程中可以按照自己的需求在接收到数据后对数据进行解析

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值