我在java中使用RXTX库,如果我写空间ascii(32)到outpurstream我可以得到数据,除非我不能得到。我不知道为什么,这可能是个问题?
问题是:我从欧姆表获取数据,我测量产品但是当我取下探针时,ohmetter显示一个值,然后显示" 0.L"但我总是得到最后的数据,所以我无法检测出是否测量了产品。
例如
02.00 OHM(核心价值)>> 125.20 OHM(同时取下探针)> 0.L(取下探头后)
我总是得到125.20 OHM,我怎样才能获得0.L值?
有什么建议吗?
编辑:
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");
}
}
答案 0 :(得分:0)
RXTX专为串行通信而设计,串行端口之间的电阻基于主板上的内部TTL转RS232转换器(或USB转串口转换器),因此更多的是硬件问题。
我猜你的问题是你试图向上或向下拉动流量控制引脚,这将有效地在引脚上产生电压(并且与引脚之间的电阻无关。)
如果您发布代码示例,我可以帮助解决代码中的任何潜在错误。和串口的预期输出。
答案 1 :(得分:0)
不幸的是,这是一个与Prova 700相关的问题,因为您描述的行为正是人们对欧姆表所期望的行为。基本上,通过从电阻器上移除探头,电阻上升,直到达到设备无法测量的水平(空气阻力)。在这种情况下,设备的内部状态将显示:我们已达到不定电阻并将显示0.0L。
我不是100%确定你的软件的确切目标是什么,但我假设这样的工作流程:
但是,正如您所看到的那样,这将无法解决。
请查看Prova 700的使用说明书。本手册对RS-232协议的确切说明是什么?像这样的其他设备具有指令协议,该协议在串行线路上进行通信,以便您能够将命令发送到系统中。然后可以执行像这样的工作流程
希望这有帮助!