本文要实现的是利用java读取串口数据。
两种不同的方法,适用于所有java读取串口的情况。
读取串口数据
方法一:使用RXTX读取串口数据
1、下载依赖
下载地址RXTX for Java (fizzed.com)http://fizzed.com/oss/rxtx-for-java
![](https://i-blog.csdnimg.cn/blog_migrate/33529d3931acf795442d18cb267453dd.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6a4a2f3a4eb3281f0e0edd14d095b26a.png)
2、将下载的依赖解压存放
可以看到在rxtx文档介绍中已经介绍了应该咋那么存放文件
rxtxParallel.dll
,rxtxSerial.dll
复制到C:\Program Files\Java\jdk1.8.0_112\jre\bi
3、新建Java项目
将RXTXcomm.jar 导入项目中。
IDEA设置:Ctrl+Shift+ALt+S——>选择Libraries——>左上角+号找到jar包所在位置添加应用。
4、新建SerialReader
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
public class SerialReader {
public static void main(String[] args) throws Exception {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM3");
SerialPort serialPort = (SerialPort) portIdentifier.open("SerialReader", 2000);
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
InputStream input = serialPort.getInputStream();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
try {
SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
Date date = new Date(System.currentTimeMillis());
Scanner scanner = new Scanner(input);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("串口发送: "+line+" "+formatter.format(date));
}
} catch (Exception e) {
System.err.println("从串口读取失败:" + e.getMessage());
}
}
};
// 每隔1秒执行一次任务x
timer.scheduleAtFixedRate(task, 0, 1000);
}
}
运行即可
注意:运行时串口不得被其他软件或者硬件占用。不然读取会报错。
方法二:使用JSerialComm读取串口数据
1、引入依赖
<dependency>
<groupId>com.fazecast</groupId>
<artifactId>jSerialComm</artifactId>
<version>2.6.2</version>
</dependency>
如果引入不进去的可以去官网下载依赖,手动导包。
2、新建JSerialCommReader
import com.fazecast.jSerialComm.SerialPort;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
public class JSerialCommReader {
public static void main(String[] args) {
SerialPort serialPort = SerialPort.getCommPort("COM3");
serialPort.openPort();
serialPort.setBaudRate(9600);
serialPort.setNumDataBits(8);
serialPort.setNumStopBits(1);
serialPort.setParity(SerialPort.NO_PARITY);
InputStream input = serialPort.getInputStream();
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
try {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
Date date = new Date(System.currentTimeMillis());
Scanner scanner = new Scanner(input);
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
System.out.println("串口发送: " + line + " " + formatter.format(date));
}
} catch (Exception e) {
System.err.println("从串口读取失败:" + e.getMessage());
}
}
};
// 每隔1秒执行一次任务
timer.scheduleAtFixedRate(task, 0, 1000);
// 运行后请记得在合适的地方关闭串口连接,例如在应用程序退出时
// serialPort.closePort();
}
}
运行即可
![](https://i-blog.csdnimg.cn/blog_migrate/fd236daa91fa28061fb249fcc628a5d6.png)
发送指令给串口
方法一 使用RXTX发送数据给串口
新建SerialWriter
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.OutputStream;
public class SerialWriter {
public static void main(String[] args) throws Exception {
// 调用 sendSerialData 方法发送串口数据
sendSerialData("COM3", "hello World");
}
/**
* 发送串口数据
*
* @param portName 串口名称
* @param data 要发送的数据
* @throws Exception 发送数据时可能抛出的异常
*/
public static void sendSerialData(String portName, String data) throws Exception {
// 获取串口标识符
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
// 打开串口
SerialPort serialPort = (SerialPort) portIdentifier.open("SerialWriter", 2000);
// 设置串口参数
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
// 获取输出流
OutputStream output = serialPort.getOutputStream();
// 将字符串转换为字节数组,并写入串口
output.write(data.getBytes());
// 关闭输出流和串口
output.close();
serialPort.close();
}
}
运行即可
方法二:使用JSerialComm 发送串口数据
新建JSerialCommWriter
单个发送
import com.fazecast.jSerialComm.SerialPort;
import java.io.OutputStream;
public class JSerialCommWriter{
public static void main(String[] args) {
// 获取串口对象
SerialPort serialPort = SerialPort.getCommPort("COM3");
// 打开串口
serialPort.openPort();
// 设置串口参数
serialPort.setBaudRate(9600);
serialPort.setNumDataBits(8);
serialPort.setNumStopBits(1);
serialPort.setParity(SerialPort.NO_PARITY);
try {
// 获取串口输出流
OutputStream output = serialPort.getOutputStream();
// 要发送的数据
String data = "Hello World";
// 将数据转换为字节数组
byte[] bytes = data.getBytes();
// 将数据写入串口输出流
output.write(bytes);
// 刷新输出流,确保数据被发送到串口
output.flush();
System.out.println("已发送数据:" + data);
} catch (Exception e) {
System.err.println("发送数据失败:" + e.getMessage());
} finally {
// 关闭串口连接
serialPort.closePort();
}
}
}
运行即可
连续发送
import com.fazecast.jSerialComm.SerialPort;
import java.io.OutputStream;
import java.util.Scanner;
public class JSerialCommWriter {
public static void main(String[] args) {
// 获取串口对象
SerialPort serialPort = SerialPort.getCommPort("COM3");
// 打开串口
serialPort.openPort();
// 设置串口参数
serialPort.setBaudRate(9600);
serialPort.setNumDataBits(8);
serialPort.setNumStopBits(1);
serialPort.setParity(SerialPort.NO_PARITY);
// 获取串口输出流
OutputStream output = serialPort.getOutputStream();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要发送的数据:");
// 不断读取用户输入并发送到串口
while (true) {
// 读取用户输入
String input = scanner.nextLine();
if (input.equalsIgnoreCase("exit")) {
break;
}
try {
// 将输入的数据转换为字节数组
byte[] data = input.getBytes();
// 将数据写入串口输出流
output.write(data);
// 刷新输出流,确保数据被发送到串口
output.flush();
System.out.println("已发送数据:" + input);
} catch (Exception e) {
System.err.println("发送数据失败:" + e.getMessage());
}
}
// 关闭串口连接
serialPort.closePort();
}
}
运行即可
区别:
RXTX 和 jSerialComm 都是用于在Java中进行串口通信的库,它们有一些区别和特点,下面我将详细比较这两个库:
1、平台支持:
- RXTX:RXTX 是一个用于串口通信的开源库,它支持多种平台,包括Windows、Linux、Mac等。然而,由于RXTX的维护相对较少,可能需要一些配置和调整才能在不同平台上正常工作。
- jSerialComm:jSerialComm 是一个用于串口通信的现代化开源库,它也支持多种平台,包括Windows、Linux、Mac等,并且相对容易配置,跨平台性能更好。
2、易用性:
- RXTX:
- RXTX 的API相对较复杂,需要开发者更多的代码来设置和管理串口通信。
- 通过 RXTX,您需要手动配置串口参数,如波特率、数据位、停止位和校验位。
- 数据的读取和写入需要更多的低级别操作,例如使用流。
- jSerialComm:
- jSerialComm 提供了更简单、更直观的API,易于使用。
- 它抽象了串口通信的许多细节,提供了更高级别的接口来处理串口通信,例如
SerialPort
和SerialPortEvent
。
3、活跃性和维护:
- RXTX:RXTX 在一段时间内没有太多活跃性,开发和维护相对较慢。新的Java版本可能会导致兼容性问题。
- jSerialComm:jSerialComm 相对较新,但活跃性较高,维护频繁。它会更及时地适应新的Java版本,并修复可能出现的问题。
4、性能:
- RXTX:RXTX 在性能上表现良好,可以处理高速的串口通信,适合需要高吞吐量的应用。
- jSerialComm:jSerialComm 在性能上表现也很不错,能够满足大多数串口通信需求,尤其适用于一般用途。
5、许可证:
- RXTX:RXTX 使用GNU通用公共许可证(GPL),这可能会限制其在某些商业项目中的使用。
- jSerialComm:jSerialComm 使用更宽松的MIT许可证,更适合在商业项目中使用。
总的来说,jSerialComm 在易用性、跨平台性和维护活跃性方面更有优势,特别适用于一般用途的串口通信。如果您需要更高性能的串口通信或有特殊需求,RXTX也是一个可选的选择,但需要更多的配置和处理。但需要注意的是,由于RXTX的维护相对较慢,建议在新项目中考虑使用jSerialComm。
下篇给大家分享如何利用websocket将串口数据进行传输
Java通过WebSocket读取传输串口数据