Java检查com端口连接

时间:2014-04-15 14:00:33

标签: java rxtx

我正在寻找一些有效的代码,可以帮助我监控com端口是否仍然使用RX/TX库打开。

假设我有一个使用虚拟COM端口与PC通信的硬件设备,该设备可以随时插入和拔出。我想在电脑上显示连接状态。

我已尝试使用下面的缓冲读卡器,它注册了设备断开但我必须从另一个方法重新打开端口。

我正在寻找像comPort.isOpen ()之类的东西吗?

// Set the value of is running
Start.isRunning = true;

// Check to see if the device is connected
while (Start.isRunning) {
    // Try to connect to the device
    try {
        // Create a Buffered Reader
        BufferedReader reader = new BufferedReader(
                new InputStreamReader(serialPort.getInputStream()));

        // Read the output
        if (Character.toString((char) reader.read()).equalsIgnoreCase(
            "^")) {
            // Set the connected flag
            Start.CONNECTED_FLAG = true;

            // Set the connected fag
            AddComponents.TFconnected.setText("Connected");
        }

        // Close the reader
        reader.close();

        // Let the thread sleep
        Thread.sleep(500);
    }

    // Catch a error if the device is disconnected
    catch (Exception err) {
        // Set the connected flag
        Start.CONNECTED_FLAG = false;
        // Set the connected fag
        AddComponents.TFconnected.setText("Disconnected");

        // Let the thread sleep
        Thread.sleep(500);
    }
}

1 个答案:

答案 0 :(得分:2)

免责声明:认为这是一个部分答案,因为我对串口的工作原理并不了解,而且我的测试无法产生任何有用的东西。无论希望如何,都可以在此发布任何内容。

不幸的是,据我所知,没有办法接收任何类型的“连接/断开连接”事件消息。可悲的是,由于我不熟悉串口的工作原理,我无法给你一个完整而恰当的解释。但是,从some research开始,该论坛中发布的一个答案就是这样说的:

  

系统没有事件通知您[断线事件],因为这需要独占使用COM端口。如果您创建了一个SerialPort对象并打开了一个端口,则在插入设备并从串行端口拔下插头时,应该获得CDChanged。这假设器件遵循引脚标准;并非所有设备都这样做。

请注意,海报和我提供的链接是在C#的上下文中讨论的。然而,这似乎与端口如何工作有关,无论语言如何,所以我有点相信这可以应用于RXTX Java。

您可以尝试some events来监听。在我的测试中,我只能接收DATA_AVAILABLE事件,但是我的设置有点不同(Raspberry PI),我现在无法将设备从端口物理断开,我只能尝试阻止设备文件(这可能解释我的测试失败)。

如果您想尝试自己的活动,请让您的班级实施SerialPortListener,注册所需的活动,检查serialEvent方法中的活动。这是一个例子:

public class YourClass implements SerialPortListener{
    private SerialPort serialPort;

    // ... serial port gets set up at some point ...

    public void registerEvents(){
        serialPort.addEventListener(this);

        // listen to all the events
        serialPort.notifyOnBreakInterrupt(true);
        serialPort.notifyOnCarrierDetect(true);
        serialPort.notifyOnCTS(true);
        serialPort.notifyOnDataAvailable(true);
        serialPort.notifyOnDSR(true);
        serialPort.notifyOnFramingError(true);
        serialPort.notifyOnOutputEmpty(true);
        serialPort.notifyOnOverrunError(true);
        serialPort.notifyOnParityError(true);
        serialPort.notifyOnRingIndicator(true);
    }

    @Override
    public void serialEvent(SerialPortEvent event) {
        System.out.println("Received event. Type: " + event.getEventType() + ", old value: " + event.getOldValue() + ", new value: " + event.getNewValue());
    }
}

如果最终失败,我相信唯一的其他替代方案与您当前的解决方案类似;尝试从端口读取,如果失败,请将其断开连接,并相应地设置指示器。在每次迭代时,如果断开连接,尝试重新连接;如果重新连接成功,请将指示器重置为“已连接”。

抱歉,我无法提供更多帮助。希望其中一些可能会带来一些有用的东西。

旁注:

如果您想稍微干掉您的代码,请将Thread.sleep(500)放在finally块中,因为它似乎无论如何都会执行。