java使用 rxtx 调用串口信息

大佬的文章
https://blog.youkuaiyun.com/wangmx1993328/article/details/88692848
这篇只做信息补充

rxtx 资源包地址
rxtx项目资源 x86 jar
https://download.youkuaiyun.com/download/ling_zhi_xin/89623027
rxtx项目资源 x64 jar
https://download.youkuaiyun.com/download/ling_zhi_xin/89623018

java 调用 串口信息 并获取信息, 具体SerialPortTool 采用上方大佬的工具类,
SerialPort addEventListener 实现读取信息的监听用来 使用

SerialPort com6 = SerialPortTool.openComPort("COM6", 9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        Thread.sleep(2000);
        System.out.println(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ssZZ"));
        com6.notifyOnDataAvailable(true);
        BlockingQueue<Boolean> queue = new LinkedBlockingQueue<>();
        com6.addEventListener(new SerialPortEventListener() {
            @Override
            public void serialEvent(SerialPortEvent serialPortEvent) {
                System.out.println(serialPortEvent.getNewValue());

                if(serialPortEvent.getNewValue()){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    try {
                        System.out.println("erw: "+SerialPortTool.readData(com6));
                        queue.add(false);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        });
        String s="open";
        SerialPortTool.sendDataToComPort(com6,s.getBytes(StandardCharsets.UTF_8));
        while (true){
            if(queue.take()){
                break;
            }
        }
        SerialPortTool.closeComPort(com6);

读取方法补充

/**
     * 从串行端口读取数据
     *
     * @param serialPort 串行端口对象
     * @return 读取到的数据
     * @throws IOException 如果读取过程中出现异常
     */
    public static String readData(SerialPort serialPort) throws IOException {
        InputStream inputStream = serialPort.getInputStream();
        byte[] buffer = new byte[1024];
        int len;
        StringBuilder sb = new StringBuilder();
        while ((len = inputStream.read(buffer)) > 0) {
            String data = new String(buffer, 0, len, StandardCharsets.UTF_8);
            int index = data.indexOf('\n'); // 查找换行符的位置
            buffer = new byte[1024];
           if (index >= 0) {
               sb.append(data.substring(0, index)); // 添加数据到 StringBuilder
                break; // 找到换行符后结束循环
            } else {
               sb.append(data); // 如果没有找到换行符,继续读取数据
           }
        }
        return sb.toString();
    }
<think>嗯,用户想用Java和jSerialComm库来监控串口连接状态。首先,我得回忆一下jSerialComm的基本用法。这个库是用来进行串口通信的,对吧?我记得它提供了一些方法来检测串口的变化,比如添加或移除设备。 首先,用户可能需要一个简单的例子来监听串口连接事件。那应该怎么开始呢?可能需要先获取所有当前可用的串口,然后注册一个事件监听器。jSerialComm的SerialPort类好像有addDataListener方法,但这里需要的是端口连接状态的监听,而不是数据监听。可能需要用SerialPort类的addPortChangeListener方法,或者类似的机制。 让我查一下jSerialComm的文档。哦,对了,SerialPort类有一个静态方法addPortChangeListener,可以用来监听端口变化事件。当有端口被添加或移除时,这个监听器会被触发。所以用户需要实现PortChangeListener接口,并重写portChanged方法。然后在这个方法里处理连接或断开的事件。 接下来,编写示例代码。首先导入必要的包,比如com.fazecast.jSerialComm.*。然后创建一个类实现SerialPortPortChangeListener接口。在main方法里注册监听器,并保持程序运行。可能需要一个无限循环或者等待用户输入,否则程序会直接退出。 另外,用户可能需要知道如何获取当前的串口列表,并在事件发生时更新这个列表。比如,在portChanged方法里,可以调用SerialPort.getCommPorts()来获取最新的端口列表,并根据changeType判断是添加还是移除。然后打印相应的信息。 需要注意的是,不同操作系统可能有不同的行为,比如在Windows和Linux下串口检测的延迟或方式可能不同。可能需要提醒用户这一点,确保他们知道可能会有延迟。 另外,用户可能想知道如何主动检测当前连接的串口。可以在示例中添加一部分代码,定期获取串口列表并检查变化。不过使用事件监听器应该是更高效的方式,不需要轮询。 还要考虑异常处理,比如确保正确释放资源,或者在监听器被触发时处理可能的异常。不过在这个简单的例子中可能不需要太复杂的处理,保持代码简洁更重要。 最后,可能需要提供一些相关的扩展问题,比如如何处理数据读取、配置串口参数,或者在多平台下的兼容性问题。这样用户可以根据自己的需求进一步探索。</think>### 使用Java和jSerialComm监控串口连接状态 #### 1. 添加依赖 首先在Maven项目中添加jSerialComm依赖: ```xml <dependency> <groupId>com.fazecast</groupId> <artifactId>jSerialComm</artifactId> <version>2.10.4</version> </dependency> ``` #### 2. 基础示例代码 ```java import com.fazecast.jSerialComm.*; public class SerialPortMonitor { public static void main(String[] args) { // 注册端口变化监听器 SerialPort.addPortChangeListener(new SerialPortPortChangeListener() { @Override public void serialEvent(SerialPortEvent event) { if (event.getEventType() == SerialPort.PORT_LIST_CHANGED) { System.out.println("检测到串口连接状态变化"); printAvailablePorts(); } } }); // 保持程序运行 while (true) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } private static void printAvailablePorts() { SerialPort[] ports = SerialPort.getCommPorts(); System.out.println("当前可用串口:"); for (SerialPort port : ports) { System.out.println("-> " + port.getSystemPortName()); } } } ``` #### 3. 功能说明 1. **事件监听**:通过`addPortChangeListener`注册串口状态变化监听器 2. **实时检测**:当USB设备插入/拔出时触发`PORT_LIST_CHANGED`事件 3. **端口信息**:`getSystemPortName()`获取操作系统级端口名称(如COM3、/dev/ttyUSB0) 4. **跨平台支持**:支持Windows/Linux/macOS系统[^2] #### 4. 扩展功能实现 ```java // 在serialEvent方法中添加详细状态判断 public void serialEvent(SerialPortEvent event) { switch (event.getEventType()) { case SerialPort.PORT_LIST_CHANGED: detectPortChanges(); break; case SerialPort.LISTENING_EVENT_DATA_AVAILABLE: // 处理数据接收 break; } } private static void detectPortChanges() { SerialPort[] newPorts = SerialPort.getCommPorts(); if (newPorts.length > previousPorts.length) { System.out.println("新设备连接: " + getNewPorts(previousPorts, newPorts)); } else { System.out.println("设备断开: " + getRemovedPorts(previousPorts, newPorts)); } previousPorts = newPorts; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值