java串口读64位数据库,java串口程序

本文档介绍如何使用Java编写一个简单的串口通信工具,包括下载RxTx库解决64位系统支持,配置Eclipse环境,代码实现串口的打开、关闭、读写操作。此外,还提及了扩展功能,如数据保存为txt文件和串口程序与数据库的连接,并提供了关键代码片段。
摘要由CSDN通过智能技术生成

最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考。另外基于这个串口程序我也添加了其它功能,例如将数据保存为txt文件,将串口程序连接到数据库中,我会一个一个的分享。

一、首先你要下载一个额外支持java串口通信操作的jar 包,由于java.comm比较老了,而且不支持64位系统,所以这里推荐RxTx这个jar包。它不仅支持32位系统,也支持64位系统。这里提供下载地址:官方下载地址:http://fizzed.com/oss/rxtx-for-java (注:可能需要FQ才能下载)。

二、配置好java环境和安装好Eclipse软件,具体配置教程网上都有,但是提醒一点,java最新的版本不提供jre包,需要手动生成jre包。我把写好的代码放在附件里,下载就可以使用,也可以基于这个修改。接下来,我来详细解释一下具体的配步骤。

三、新建一个java项目,

1574684496298916.png

找到项目在文件夹里的位置,并打开。

1574684615228620.png

将我给的附件下载并解压,

1574684740240711.png

将serialMonitor文件里的src文件夹复制到自己的java项目中,将RxTxjar包文件夹复制到自己项目中,

1574684932354945.png

1574685006660044.png

刷新自己项目

1574685081470781.png

右击项目,点击bulid path,选择最后一个configure build path,将RxTx包导入到项目中。

1574685149577090.png

433d56aa71aa6ffbe0082c9ab086a8a2.png

注:如果运行过程中抛出 java.lang.UnsatisfiedLinkError 错误或 gnu.io 下的类找不到,请将rxtx解压包中 的 rxtxParallel.dll,rxtxSerial.dll 这两个文件复制到 C:\Windows\System32 目录下即可解决该错误。

然后运行可得

1574685782946528.png

1574685829239365.png

选择正确的串口,选择正确的波特率就能使用了。

下面代码解析:package serialPort;

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 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 serialException.*;

/**

* 串口服务类,提供打开、关闭串口,读取、发送串口数据等服务(采用单例设计模式)

* @author zhong

*

*/

public class SerialTool {

private static SerialTool serialTool = null;

static {

//在该类被ClassLoader加载时就初始化一个SerialTool对象

if (serialTool == null) {

serialTool = new SerialTool();

}

}

//私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象

private SerialTool() {}

/**

* 获取提供服务的SerialTool对象

* @return serialTool

*/

public static SerialTool getSerialTool() {

if (serialTool == null) {

serialTool = new SerialTool();

}

return serialTool;

}

/**

* 查找所有可用端口

* @return 可用端口名称列表

*/

public static final ArrayList findPort() {

//获得当前所有可用串口

Enumeration portList = CommPortIdentifier.getPortIdentifiers();

ArrayList portNameList = new ArrayList<>();

//将可用串口名添加到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();

}

//System.out.println("Open " + portName + " sucessfully !");

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();

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

while (bufflenth != 0) {

bytes = new byte[bufflenth];//初始化byte数组为buffer中数据的长度

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();

}

}

}

dataview中的代码可以根据自己的需求进行修改,后期我会放出保存为txt文件和连接数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值