Java 在RxTx中发送多个查询
我试图一次发送几个查询到设备车的ECU,特别是通过RxTx。下面是使用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,
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实现的整个应用程序当前解决方案,这会阻塞整个应用程序。我该怎么做