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

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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Java读取串口设备信息的问题,可以通过Java提供的串口通信API来实现。下面是一个简单的示例代码,可以帮助你了解如何使用Java读取串口设备信息。 ```java import java.io.*; import java.util.*; import gnu.io.*; public class SerialTest implements SerialPortEventListener { SerialPort serialPort; public void initialize() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); if (currPortId.getName().equals("COM1")) { portId = currPortId; break; } } if (portId == null) { System.out.println("Could not find COM port."); return; } try { serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000); serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); InputStream in = serialPort.getInputStream(); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (Exception e) { System.err.println(e.toString()); } } public synchronized void close() { if (serialPort != null) { serialPort.removeEventListener(); serialPort.close(); } } public synchronized void serialEvent(SerialPortEvent oEvent) { if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { String inputLine = ""; BufferedReader reader = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); inputLine = reader.readLine(); System.out.println("Received: " + inputLine); } catch (Exception e) { System.err.println(e.toString()); } } } public static void main(String[] args) { SerialTest main = new SerialTest(); main.initialize(); System.out.println("Started"); } } ``` 该示例代码通过Java串口通信API来与串口设备进行通信,包括设置串口参数、监听串口事件、读取串口数据等。其中,`initialize()`方法用于初始化串口,`close()`方法用于关闭串口,`serialEvent()`方法用于处理串口事件,`main()`方法用于启动程序并初始化串口。 需要注意的是,在使用Java串口通信API时,需要先安装对应的驱动程序,并且需要在代码中指定正确的串口名称(例如COM1)。此外,不同的串口设备可能需要不同的串口参数设置,需要根据实际情况进行调整。 另外,如果需要读取扫描枪等设备的数据,则需要根据设备的数据格式进行解析。一般来说,扫描枪会将扫描的条码数据以字符串的形式发送到串口设备,因此可以通过读取串口数据来获取扫描的条码数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值