【发布时间】:2011-07-10 07:40:03
【问题描述】:
我正在尝试使用 RXTX 库来阻止 Windows(XP 和 7)上的串行通信。我已经在两端测试了与 Hyperterminal 的连接,并且可以正常工作。
我使用以下代码设置连接:(为清楚起见,省略了异常处理和防御检查)
private InputStream inStream;
private OutputStream outStream;
private BufferedReader inReader;
private PrintWriter outWriter;
private SerialPort serialPort;
private final String serialPortName;
public StreamComSerial(String serialPortName) {
this.serialPortName = serialPortName;
CommPortIdentifier portIdentifier;
portIdentifier = CommPortIdentifier.getPortIdentifier(serialPortName);
CommPort commPort = null;
commPort = portIdentifier.open(this.getClass().getName(),500);
serialPort = (SerialPort) commPort; serialPort.setSerialPortParams(4800,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
inStream = serialPort.getInputStream();
outStream = serialPort.getOutputStream();
inReader = new BufferedReader(new InputStreamReader(inStream, Settings.getCharset()));
outWriter = new PrintWriter(new OutputStreamWriter(outStream, Settings.getCharset()));
当我使用时
outWriter.println("test message");
flush();
消息在另一端接收良好,但呼叫
inReader.readLine()
立即返回“java.io.IOException:基础输入流返回零字节”。
然后我决定尝试实现我自己的阻塞读取逻辑并写了这个:
public String readLine() throws IOException {
String line = new String();
byte[] nextByte = {-1};
while (true) {
nextByte[0] = (byte)inStream.read();
logger.debug("int read: " + nextByte[0]);
if (nextByte[0] == (byte)-1) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
continue;
}
logger.debug("byte read: " + nextByte[0]);
line = line + new String(nextByte);
if (nextByte[0] == (byte)13) { // 13 is carriage return in ASCII
return line;
}
}
}
但是这段代码进入了一个无限循环并且“nextByte[0] = (byte)inStream.read();”无论通过串行连接发送什么,都分配 -1。此外,另一端的口吃很严重,只让我每 1-3 秒发送一个字符。如果我尝试在短时间内发送许多字符,则会挂起很长时间。
非常感谢任何帮助。
*edit - 使用 inStream.read(nextByte) 而不是 "nextByte[0] = (byte)inStream.read();"不会写入 nextByte 变量,无论我通过串行连接发送什么。
*edit2 - 由于我的代码可以完美地与 SUN javax.comm 库和我从朋友那里得到的 win32com.dll 一起工作,我已经停止尝试让它与 RXTX 一起工作。我对解锁通信不感兴趣,这似乎是其他人可以使 RXTX 工作的唯一方法。
【问题讨论】:
-
*edit - 进一步调试表明无论通过串行连接发送什么,inStream.read(nextByte) 都不会写入 nextByte 变量。
-
@Peter Knego - 是的,它看起来相关,但我对他试图实现的多线程解锁行为不感兴趣。
-
嗨 Svante。我也在为同样的问题苦苦挣扎。你在哪里得到 win32com.dll 和 javax.comm。你能指导我吗。
标签: java serial-port rxtx