Java 设备断开连接时RXTX仍在读取数据

Java 设备断开连接时RXTX仍在读取数据,java,rxtx,Java,Rxtx,我在java中使用RXTX库,如果我将空间ascii(32)写入outpurstream,我可以获取数据,除非我无法获取。我不知道为什么,这可能是个问题 问题是:我从欧姆表获得数据,我测量产品,但当我取下探针时,欧姆表显示一个值,然后显示“0.L”,但我总是得到最后一个数据,所以我无法检测欧姆表是否测量产品 比如说 02.00欧姆(coreect值)>> 125.20欧姆(取下探头时)>> 0.L(取下探头后) 我总是得到125.20欧姆,怎么才能得到0.1欧姆的值 有什么建议吗 编辑: pub

我在java中使用RXTX库,如果我将空间ascii(32)写入outpurstream,我可以获取数据,除非我无法获取。我不知道为什么,这可能是个问题

问题是:我从欧姆表获得数据,我测量产品,但当我取下探针时,欧姆表显示一个值,然后显示“0.L”,但我总是得到最后一个数据,所以我无法检测欧姆表是否测量产品

比如说

02.00欧姆(coreect值)>> 125.20欧姆(取下探头时)>> 0.L(取下探头后)

我总是得到125.20欧姆,怎么才能得到0.1欧姆的值

有什么建议吗

编辑:

public class SerialComm {

SerialPort serialPort;
OutputStream outStream = null;
InputStream inStream = null;

public SerialComm() {
    super();
}

void connect(String portName) throws Exception {

    CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(portName);
    serialPort = (SerialPort) portId.open("gnu.io.CommPortIdentifier", 5000);
    int baudRate = 9600;

    serialPort.setSerialPortParams(
            baudRate,
            SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_NONE);
    serialPort.setFlowControlMode(
            SerialPort.FLOWCONTROL_NONE);
    setSerialListener();
}

public void initIOStream() throws InterruptedException {

    try {
        outStream = serialPort.getOutputStream();
        inStream = serialPort.getInputStream();
        write();
    } catch (IOException ex) {
        Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public void disconnect() {
    if (serialPort != null) {
        try {
            outStream.close();
            inStream.close();
        } catch (IOException ex) {
        }
        serialPort.close();
    }
}

public void write() throws IOException, InterruptedException {
    outStream.write(32);
    outStream.flush();
}

private byte[] readBuffer = new byte[400];

private void readSerial() throws InterruptedException, Exception {
    try {
        initIOStream();
        Thread.sleep(2000);
        int availableBytes = inStream.available();
        if (availableBytes > 0) {
            inStream.read(readBuffer, 0, availableBytes);
            System.out.println("value:  " + new String(readBuffer, 0, 30));
        }
    } catch (IOException e) {
    }
}

private class SerialEventHandler implements SerialPortEventListener {

    @Override
    public void serialEvent(SerialPortEvent event) {
        System.out.println("event.getEventType()" + event.getEventType());
        switch (event.getEventType()) {
            case SerialPortEvent.DATA_AVAILABLE: {
                try {
                    readSerial();
                } catch (Exception ex) {
                    Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            break;
        }
    }
}

private class ReadThread implements Runnable {

    @Override
    public void run() {
        while (true) {
            try {
                readSerial();
            } catch (InterruptedException ex) {
                Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(SerialComm.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

public void setSerialListener() throws InterruptedException, TooManyListenersException {
    new Thread(new ReadThread()).start();
}

public void setSerialEventHandler(SerialPort serialPort) throws Exception {
    try {
        initIOStream();
        serialPort.addEventListener(new SerialEventHandler());
        serialPort.notifyOnDataAvailable(true);
    } catch (TooManyListenersException ex) {
        System.err.println(ex.getMessage());
    }
}

public static void main(String args[]) throws IOException, Exception {
    SerialComm serial = new SerialComm();
    serial.connect("COM3");
}

}RXTX是为串行通信而设计的,串行端口之间的电阻基于主板上的内部TTL到RS232转换器(或usb到串行转换器),因此更像是一个硬件问题

我从你的问题中猜测,你正试图向上或向下拉动流量控制管脚,这将有效地在管脚上产生电压(与管脚之间的电阻无关)


如果您发布一个代码示例,我可以帮助您解决代码中的任何潜在错误。以及串行端口的预期输出。

不幸的是,这是一个与Prova 700相关的问题,因为您描述的行为正是欧姆表的预期行为。基本上,通过将探头从电阻器上拆下,电阻会升高,直到达到设备无法测量的水平(空气电阻)。在这种情况下,设备的内部状态将显示:我们已达到无穷大电阻,将显示0.0L

我不能100%确定您的软件的确切目标是什么,但我假设工作流程如下:

  • 用户连接一个电阻器
  • 移除探针后,软件会自动记录数据
但是,正如您所看到的,这将不起作用

请参阅Prova 700的使用手册。手册对RS-232协议的具体说明是什么?像这样的其他设备有一个指令协议,可以通过串行线路进行通信,这样您就可以向系统发送命令。然后可以执行这样的工作流

  • 用户将探头连接到电阻器上
  • 按下电脑上的按钮
  • 计算机向欧姆表发送指令
  • 欧姆表回复电流电阻
  • 计算机存储电阻,并显示一条信息,表明移除探针已保存电阻

希望这有帮助

您使用的是什么精确的欧姆表?Prova型号700欧姆表谢谢您的回答,我想得到电阻值,并与产品性能进行比较,如果公差产品中的值通过测试。问题是,如果用户在移除探针时出错并进行测量,因为我得到的是静态值,而如果产品线出现问题,我必须得到0.L值,即使探针已连接。