java读取串口数据_使用Java实现串口通信(二)

本文介绍了如何使用Java进行串口通信的优化,包括使用RXTX库、设置波特率、数据位等参数,并解决了数据读取不完整的问题。文章提供了串口管理类`SerialPortManager`的详细代码,支持打开、关闭串口,发送和接收数据,以及添加监听器。此外,还展示了主窗口`MainFrame`的实现,允许用户选择ASCII或Hex数据格式进行发送和接收,增强了数据格式处理功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.写在前面

距离上一篇文章《使用Java实现串口通信》已经过去快两年的时间了,在此期间收到了很多读者的反馈,很高兴可以帮助到这么多人,根据收到的反馈,我对代码逻辑进行了优化整理,并增加了一些新功能,在此记录下,分享给大家。

先看下效果:

ceca5332b3b4

串口通信

2.环境搭建

本文的串口通信开发基于RXTX,所以需要引用一些RXTX的依赖包:

拷贝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext目录中;

拷贝 rxtxSerial.dll 到 JAVA_HOME\jre\bin目录中;

拷贝 rxtxParallel.dll 到 JAVA_HOME\jre\bin目录中;

JAVA_HOME为jdk安装路径

注意:有同学遇到运行程序,报找不到main方法的错误,检查一下依赖包拷贝的路径是否正确,jdk安装后会生成两个jre目录,需要拷贝到jdk > jre目录下。

3.串口通信管理

SerialPortManager实现了对串口通信的管理,包括查找可用端口、打开|关闭串口、发送|接收数据。

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

*/

@SuppressWarnings("all")

public class SerialPortManager {

/**

* 查找所有可用端口

*

* @return 可用端口名称列表

*/

public static final ArrayList findPorts() {

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

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 PortInUseException

* 串口已被占用

*/

public static final SerialPort openPort(String portName, int baudrate) throws PortInUseException {

try {

// 通过端口名识别端口

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

// 打开端口,并给端口名字和一个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.writ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值