【问题标题】:How do I detect when a serial port has been closed by the device in java?java - 如何检测java中的设备何时关闭了串行端口?
【发布时间】:2013-07-26 19:30:52
【问题描述】:

我目前正在使用 RXTX 在我的 java 程序中处理串行通信,并且我已经成功地能够连接/断开连接和读/写。

但是,我无法弄清楚 RXTX 中是否有办法检测设备是否在结束时断开连接。如果不轮询串行端口,您将如何检测此事件?因为如果它在轮询之间断开并重新连接,它不会被检测到,但在使用串行端口时仍然会导致错误。

如果在 RXTX 中不可能,是否有任何推荐的库可以检测断开事件?

澄清:设备通过 USB 连接并注册为串行设备。设备在重置或关闭时可能会断开连接。当它重置串行端口时,会暂时关闭使 RXTX 创建的连接失效。

感谢您的帮助

【问题讨论】:

  • 取决于您所说的“断开连接”。你的意思是物理上/电气上?这可能会导致一条或多条线路(DCD、DTR、DSR、RTS、CTS)的电平变化,但这取决于很多事情(即是否实际使用了这些线路中的任何一条,因为它们实际上都不是必需的)。我强烈怀疑“断开连接”的概念定义不明确,原则上可能无法检测到,除非您使用提供它的物理层协议(即 DCD)
  • 据我所知,您必须手动检查设备是否连接到串口。

标签: java serial-port rxtx


【解决方案1】:

我有同样的问题:我想知道设备何时从 USB 端口拔出。 然后,我发现每次从 USB 端口拔下设备时,它都会从 serialEvent 中获取 java.io.IOException。看看下面我的serialEvent代码:

@Override
public void serialEvent(SerialPortEvent evt) {
    if(this.getConectado()){
        if (evt.getEventType() == SerialPortEvent.DATA_AVAILABLE)
        {
            try {                
                byte singleData  = (byte)input.read();

                if (singleData == START_DELIMITER)
                {
                    singleData = (byte)input.read();
                    if(singleData == (byte)0x00)
                    {
                        singleData = (byte)input.read(); //get the length
                        byte[] buffer = new byte[singleData+4];
                        for(byte i=0x0;i<singleData;i++)
                            buffer[i+3] = (byte)input.read();
                        buffer[buffer.length-1] = (byte)input.read();
                        buffer[0] = START_DELIMITER;
                        buffer[1] = 0x00;
                        buffer[2] = singleData; //length

                        this.addNaLista(buffer);

                    }
                }
            } catch (IOException ex) {
                Logger.getLogger(Comunicador.class.getName()).log(Level.SEVERE, null, ex);
                /* do something here */
                //System.exit(1);
            }

        }
    }
}  

即使当时我没有收到数据,我仍然会收到 java.io.IOException;这是异常跟踪:

Jun 21, 2014 10:57:19 AM inovale.serial.Comunicador serialEvent
SEVERE: null
java.io.IOException: No error in readByte
at gnu.io.RXTXPort.readByte(Native Method)
at gnu.io.RXTXPort$SerialInputStream.read(RXTXPort.java:1250)
at inovale.serial.Comunicador.serialEvent(Comunicador.java:336)
at gnu.io.RXTXPort.sendEvent(RXTXPort.java:732)
at gnu.io.RXTXPort.eventLoop(Native Method)
at gnu.io.RXTXPort$MonitorThread.run(RXTXPort.java:1575)

我使用的唯一事件是:

serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);

这是我看到的检测断开(物理)事件的方式。

【讨论】:

  • 我试过了,但在我的情况下它不起作用...我添加了 eventListener 并将 onData 设置为 true...但是当我断开设备连接时,不会调用该方法..跨度>
猜你喜欢
  • 2012-10-03
  • 2015-09-15
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 1970-01-01
  • 2013-08-24
相关资源
最近更新 更多