Java 在RxTx中发送多个查询

Java 在RxTx中发送多个查询,java,scala,rxtx,Java,Scala,Rxtx,我试图一次发送几个查询到设备车的ECU,特别是通过RxTx。下面是使用RxTx的类: import collection.JavaConversions._ import gnu.io._ import java.io._ import java.util.TooManyListenersException class Serial private (portName: String, baudRate: Int,

我试图一次发送几个查询到设备车的ECU,特别是通过RxTx。下面是使用RxTx的类:

import collection.JavaConversions._
import gnu.io._
import java.io._
import java.util.TooManyListenersException

class Serial private (portName: String, 
                      baudRate: Int, 
                      dataBits: Int, 
                      stopBits: Int, 
                      parity: Int, 
                      flowControl: Int) {

  private val portId = CommPortIdentifier.getPortIdentifier(portName)
  private val serial = portId.open("Serial Connection from OBDScan", 
                                   5000).asInstanceOf[SerialPort]
  setPortParameters(baudRate, dataBits, stopBits, parity, flowControl)

  private val istream = serial.getInputStream
  private val ostream = serial.getOutputStream

  def this(portName: String, baudRate: Int = 115200) = this(portName, baudRate,
    SerialPort.DATABITS_8,
    SerialPort.STOPBITS_1,
    SerialPort.PARITY_NONE,
    SerialPort.FLOWCONTROL_NONE)

  def close = {
    try {
      istream.close
      ostream.close
    } catch {
      case ioe: IOException => // don't care, it's ended already
    }

    serial.close
  }

  def query(command: String) = {
    ostream.write(command.getBytes)
    ostream.write("\r\n".getBytes) // neccessary for Serial port.
  }

  def queryResult: String = {
    try {
      val availableBytes = istream.available
      val buffer = new Array[Byte](availableBytes)

      if (availableBytes > 0) {
        istream.read(buffer, 0, availableBytes)
      }
      new String(buffer, 0, availableBytes)
    } catch {
      case ioe: IOException => "Something wrong! Please try again."
    }
  }

  def addListener(listener: SerialPortEventListener) = {
    try {
      serial.addEventListener(listener)
      serial.notifyOnDataAvailable(true)
    } catch {
      case tm: TooManyListenersException => println("Too many listener")
    }
  }

  def removeListener = {
    serial.removeEventListener
  }

  private def setPortParameters(br: Int, 
                                db: Int, 
                                sb: Int, 
                                p: Int, 
                                fc: Int) = {
    serial.setSerialPortParams(baudRate, dataBits, stopBits, parity)
    serial.setFlowControlMode(flowControl)
  }
}

object Serial {
  def connect(portName: String, baudRate: Int = 115200): Serial = {
    try {
      val ret = new Serial(portName, baudRate)
      ret
    } catch {
      // exception handling omitted.
    }
  }
}
现在查询工作正常,并给出正确的结果。当我同时发送几个查询时,问题就出现了:

val serial = Serial.connect("COM34")
serial.query("AT Z")
serial.query("10 00")
设备接收了两个查询,但只返回一个结果。如果我想得到下一个结果,我必须发送另一个查询,这将导致程序延迟一个查询。如果在每次查询后调用Thread.sleep:

val serial = Serial.connect("COM34")
serial.query("AT Z")
Thread.sleep(500)
serial.query("10 00")
问题已经解决,但是当调用Thread.sleep时,整个应用程序当然会停止。我不希望这样,因为应用程序将一直执行此查询,这意味着如果我执行此操作,它将一直挂起

因为我在Scala上,所以我考虑使用Actors或类似的东西,但我认为对于桌面应用程序来说,这是一种过度使用。没有演员有没有办法做到这一点?也许我从串行端口读取的响应有误

TL;DR:我想通过RxTx对串行设备进行几次查询,而不锁定通过Thread.sleep实现的整个应用程序当前解决方案,这会阻塞整个应用程序。我该怎么做