JAVA使用RXTX包串口程序在Linux部署 (错误:[librxtxSerial.so]Java_gnu_io_RXTXPort_nativeDrain)

问题描述

RXTX串口读写在windows下开发正常,在Linux下存在bug,主要表现为:在代码中能正常开启串口后,发数据、收数据时,jvm崩溃报错。  [librxtxSerial.so]Java_gnu_io_RXTXPort_nativeDrain)

解决方案:

    arduino开源,开源了在RXTX基础上修改完善的RXTX代码,该代码可在Linux平台上编译,编译生成.so文件以及RXTXcomm.jar引用包,最后完美解决。
    git hub地址:https://github.com/arduino/RXTX

解决步骤

 1. echo $JAVA_HOME是否输出Java环境变量,没有则自行百度配置Java环境变量
 2. 进入RXTX-master文件夹,终端输入./configure开始检测系统环境
 3. 终端输入make,则在当前目录自动生成RXTXcomm.jar(使用该jar)以及当前CPU架构的文件夹(例如x86_64-unkown-linux-gnu)
 4. 在3步生成的文件夹下存在隐藏文件夹.libs,你所需要的动态库.so在该libs文件夹下
 5. 将生成的两个.so文件拷贝至$JAVA_HOME/jre/lib/amd64(amd64是我的CPU类型,换成你的),或者拷贝至/usr/lib64目录下,均需要将.so文件赋予执行权限

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是一个简单的基于RXTX串口通信Java程序示例: ```java import gnu.io.*; import java.io.*; import java.util.Enumeration; public class SerialPortCommunication implements SerialPortEventListener { private SerialPort serialPort; private InputStream inputStream; private OutputStream outputStream; private static final int TIME_OUT = 2000; // 等待超时时间 private static final int DATA_RATE = 9600; // 串口数据传输速率 public void initialize() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); // 遍历所有可用串口,找到指定的串口 while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); if ("COM3".equals(currPortId.getName())) { portId = currPortId; break; } } if (portId == null) { System.out.println("找不到指定的串口"); return; } try { // 打开串口,设置参数 serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // 获取输入输出流 inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); // 添加串口事件监听器 serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (PortInUseException | UnsupportedCommOperationException | IOException | TooManyListenersException e) { e.printStackTrace(); } } // 发送数据 public void sendData(String data) { try { outputStream.write(data.getBytes()); } catch (IOException e) { e.printStackTrace(); } } // 读取数据 public void serialEvent(SerialPortEvent evt) { if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { int availableBytes = inputStream.available(); byte[] bytes = new byte[availableBytes]; inputStream.read(bytes, 0, availableBytes); String data = new String(bytes); System.out.println("接收到数据:" + data); } catch (IOException e) { e.printStackTrace(); } } } public static void main(String[] args) { SerialPortCommunication serialPortCommunication = new SerialPortCommunication(); serialPortCommunication.initialize(); serialPortCommunication.sendData("Hello World!"); } } ``` 这个程序可以初始化一个串口,设置参数,发送和接收数据。其中,`initialize()` 方法中的 `COM3` 是指定的串口名称,需要根据实际情况修改。在 `main` 方法中,我们初始化了一个 `SerialPortCommunication` 对象,并发送了一个字符串 "Hello World!"。你可以根据自己的需求修改该程序
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值