当前位置:   article > 正文

Java读取串口数据,发送指令给超简单的两种方式_java 读取串口数据

java 读取串口数据

本文要实现的是利用java读取串口数据。

两种不同的方法,适用于所有java读取串口的情况。

读取串口数据

 方法一:使用RXTX读取串口数据

 1、下载依赖

 下载地址RXTX for Java (fizzed.com)icon-default.png?t=N7T8http://fizzed.com/oss/rxtx-for-java


2、将下载的依赖解压存放

可以看到在rxtx文档介绍中已经介绍了应该咋那么存放文件
rxtxParallel.dllrxtxSerial.dll
复制到 C:\Program Files\Java\jdk1.8.0_112\jre\bi

 

3、新建Java项目

RXTXcomm.jar  导入项目中。
IDEA设置:Ctrl+Shift+ALt+S——>选择Libraries——>左上角+号找到jar包所在位置添加应用。

 4、新建SerialReader

  1. import gnu.io.CommPortIdentifier;
  2. import gnu.io.SerialPort;
  3. import java.io.InputStream;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. import java.util.Scanner;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9. public class SerialReader {
  10. public static void main(String[] args) throws Exception {
  11. CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM3");
  12. SerialPort serialPort = (SerialPort) portIdentifier.open("SerialReader", 2000);
  13. serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
  14. InputStream input = serialPort.getInputStream();
  15. Timer timer = new Timer();
  16. TimerTask task = new TimerTask() {
  17. @Override
  18. public void run() {
  19. try {
  20. SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
  21. Date date = new Date(System.currentTimeMillis());
  22. Scanner scanner = new Scanner(input);
  23. while (scanner.hasNextLine()) {
  24. String line = scanner.nextLine();
  25. System.out.println("串口发送: "+line+" "+formatter.format(date));
  26. }
  27. } catch (Exception e) {
  28. System.err.println("从串口读取失败:" + e.getMessage());
  29. }
  30. }
  31. };
  32. // 每隔1秒执行一次任务x
  33. timer.scheduleAtFixedRate(task, 0, 1000);
  34. }
  35. }

运行即可

 注意:运行时串口不得被其他软件或者硬件占用。不然读取会报错。

方法二:使用JSerialComm读取串口数据

1、引入依赖

  1. <dependency>
  2. <groupId>com.fazecast</groupId>
  3. <artifactId>jSerialComm</artifactId>
  4. <version>2.6.2</version>
  5. </dependency>
如果引入不进去的可以去​​​​​官网下载依赖,手动导包。

2、新建JSerialCommReader

  1. import com.fazecast.jSerialComm.SerialPort;
  2. import java.io.InputStream;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Scanner;
  6. import java.util.Timer;
  7. import java.util.TimerTask;
  8. public class JSerialCommReader {
  9. public static void main(String[] args) {
  10. SerialPort serialPort = SerialPort.getCommPort("COM3");
  11. serialPort.openPort();
  12. serialPort.setBaudRate(9600);
  13. serialPort.setNumDataBits(8);
  14. serialPort.setNumStopBits(1);
  15. serialPort.setParity(SerialPort.NO_PARITY);
  16. InputStream input = serialPort.getInputStream();
  17. Timer timer = new Timer();
  18. TimerTask task = new TimerTask() {
  19. @Override
  20. public void run() {
  21. try {
  22. SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
  23. Date date = new Date(System.currentTimeMillis());
  24. Scanner scanner = new Scanner(input);
  25. while (scanner.hasNextLine()) {
  26. String line = scanner.nextLine();
  27. System.out.println("串口发送: " + line + " " + formatter.format(date));
  28. }
  29. } catch (Exception e) {
  30. System.err.println("从串口读取失败:" + e.getMessage());
  31. }
  32. }
  33. };
  34. // 每隔1秒执行一次任务
  35. timer.scheduleAtFixedRate(task, 0, 1000);
  36. // 运行后请记得在合适的地方关闭串口连接,例如在应用程序退出时
  37. // serialPort.closePort();
  38. }
  39. }

 运行即可

发送指令给串口

方法一 使用RXTX发送数据给串口

新建SerialWriter

  1. import gnu.io.CommPortIdentifier;
  2. import gnu.io.SerialPort;
  3. import java.io.OutputStream;
  4. public class SerialWriter {
  5. public static void main(String[] args) throws Exception {
  6. // 调用 sendSerialData 方法发送串口数据
  7. sendSerialData("COM3", "hello World");
  8. }
  9. /**
  10. * 发送串口数据
  11. *
  12. * @param portName 串口名称
  13. * @param data 要发送的数据
  14. * @throws Exception 发送数据时可能抛出的异常
  15. */
  16. public static void sendSerialData(String portName, String data) throws Exception {
  17. // 获取串口标识符
  18. CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
  19. // 打开串口
  20. SerialPort serialPort = (SerialPort) portIdentifier.open("SerialWriter", 2000);
  21. // 设置串口参数
  22. serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
  23. // 获取输出流
  24. OutputStream output = serialPort.getOutputStream();
  25. // 将字符串转换为字节数组,并写入串口
  26. output.write(data.getBytes());
  27. // 关闭输出流和串口
  28. output.close();
  29. serialPort.close();
  30. }
  31. }
运行即可

方法二:使用JSerialComm 发送串口数据


新建JSerialCommWriter

单个发送
  1. import com.fazecast.jSerialComm.SerialPort;
  2. import java.io.OutputStream;
  3. public class JSerialCommWriter{
  4. public static void main(String[] args) {
  5. // 获取串口对象
  6. SerialPort serialPort = SerialPort.getCommPort("COM3");
  7. // 打开串口
  8. serialPort.openPort();
  9. // 设置串口参数
  10. serialPort.setBaudRate(9600);
  11. serialPort.setNumDataBits(8);
  12. serialPort.setNumStopBits(1);
  13. serialPort.setParity(SerialPort.NO_PARITY);
  14. try {
  15. // 获取串口输出流
  16. OutputStream output = serialPort.getOutputStream();
  17. // 要发送的数据
  18. String data = "Hello World";
  19. // 将数据转换为字节数组
  20. byte[] bytes = data.getBytes();
  21. // 将数据写入串口输出流
  22. output.write(bytes);
  23. // 刷新输出流,确保数据被发送到串口
  24. output.flush();
  25. System.out.println("已发送数据:" + data);
  26. } catch (Exception e) {
  27. System.err.println("发送数据失败:" + e.getMessage());
  28. } finally {
  29. // 关闭串口连接
  30. serialPort.closePort();
  31. }
  32. }
  33. }
 运行即可

连续发送
  1. import com.fazecast.jSerialComm.SerialPort;
  2. import java.io.OutputStream;
  3. import java.util.Scanner;
  4. public class JSerialCommWriter {
  5. public static void main(String[] args) {
  6. // 获取串口对象
  7. SerialPort serialPort = SerialPort.getCommPort("COM3");
  8. // 打开串口
  9. serialPort.openPort();
  10. // 设置串口参数
  11. serialPort.setBaudRate(9600);
  12. serialPort.setNumDataBits(8);
  13. serialPort.setNumStopBits(1);
  14. serialPort.setParity(SerialPort.NO_PARITY);
  15. // 获取串口输出流
  16. OutputStream output = serialPort.getOutputStream();
  17. Scanner scanner = new Scanner(System.in);
  18. System.out.println("请输入要发送的数据:");
  19. // 不断读取用户输入并发送到串口
  20. while (true) {
  21. // 读取用户输入
  22. String input = scanner.nextLine();
  23. if (input.equalsIgnoreCase("exit")) {
  24. break;
  25. }
  26. try {
  27. // 将输入的数据转换为字节数组
  28. byte[] data = input.getBytes();
  29. // 将数据写入串口输出流
  30. output.write(data);
  31. // 刷新输出流,确保数据被发送到串口
  32. output.flush();
  33. System.out.println("已发送数据:" + input);
  34. } catch (Exception e) {
  35. System.err.println("发送数据失败:" + e.getMessage());
  36. }
  37. }
  38. // 关闭串口连接
  39. serialPort.closePort();
  40. }
  41. }
运行即可

区别:

RXTX 和 jSerialComm 都是用于在Java中进行串口通信的库,它们有一些区别和特点,下面我将详细比较这两个库:

1、平台支持:

  • RXTX:RXTX 是一个用于串口通信的开源库,它支持多种平台,包括Windows、Linux、Mac等。然而,由于RXTX的维护相对较少,可能需要一些配置和调整才能在不同平台上正常工作。
  • jSerialComm:jSerialComm 是一个用于串口通信的现代化开源库,它也支持多种平台,包括Windows、Linux、Mac等,并且相对容易配置,跨平台性能更好。

2、易用性:

  • RXTX:
    • RXTX 的API相对较复杂,需要开发者更多的代码来设置和管理串口通信。
    • 通过 RXTX,您需要手动配置串口参数,如波特率、数据位、停止位和校验位。
    • 数据的读取和写入需要更多的低级别操作,例如使用流。
  • jSerialComm:
    • jSerialComm 提供了更简单、更直观的API,易于使用。
    • 它抽象了串口通信的许多细节,提供了更高级别的接口来处理串口通信,例如SerialPortSerialPortEvent

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读取传输串口数据

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/326218
推荐阅读
相关标签
  

闽ICP备14008679号