java - RXTX 串行连接 - 阻塞 read() 的问题

标签 java serial-port rxtx

我正在尝试使用 RXTX 库来阻止 Windows(XP 和 7)上的串行通信。我已经测试了两端与 super 终端的连接,它工作得很好。

我使用以下代码建立了连接:(为清楚起见,省略了异常处理和防御检查)

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秒只能让我发送一个字符。如果我尝试在短时间内发送许多字符,则会挂起很长时间。

非常感谢任何帮助。

*编辑 - 使用 inStream.read(nextByte) 而不是“nextByte[0] = (byte)inStream.read();”不写入 nextByte 变量,无论我通过串行连接发送给它什么。

*edit2 - 因为我的代码与 SUN javax.comm lib 和我从 friend 那里得到的 win32com.dll 完美配合,我已经停止尝试让它与 RXTX 一起工作。我对解锁通信不感兴趣,这似乎是其他人可以让 RXTX 工作的唯一方法。

最佳答案

使用 RXTX-2.2pre2,以前的版本有一个错误,阻止 I/O 正常工作。

并且不要忘记将端口设置为阻塞模式:

serialPort.disableReceiveTimeout();
serialPort.enableReceiveThreshold(1);

关于java - RXTX 串行连接 - 阻塞 read() 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5219450/

相关文章:

java - 由多个进程同步轮询文件中的对象列表

java - Android Studio TextView 初始化 C++

c++ - COM口读后不写

vb.net - 如何通过 RF-433 模块从 VB 应用程序和 arduino 发送数据

c++ - Qchar* 到 char* 的转换

java - 端口未列出

java - RXTX java,inputStream不返回所有缓冲区

java - 如何在循环中访问对象字段?

java - 无法理解 File object.delete() 的工作原理

Java RXTX 和打包