从commport读取不会在java上返回完整的结果

时间:2012-03-30 04:05:37

标签: java rxtx

我试图使用rxtx API从com端口读取。 com端口连接到微控制器,因此每次按下微控制器板上的按钮,它将返回一系列从0x01到0xff的字节数。我想在我的java控制台上显示这些数字,但它似乎能够读取到0x40。之后的所有其他字节数似乎都迷失了。我非常确定微控制器工作正常,因为我在另一个终端程序中进行了测试,然后给出了正确的结果。所以我怀疑我的输入流有问题。有没有人可以帮我找到问题?以下是我的java代码,这是我从谷歌找到的典型串行com端口读取示例代码。

import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;
import java.io.*;
import java.util.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args) {
    portList = CommPortIdentifier.getPortIdentifiers();

    while (portList.hasMoreElements()) {
        portId = (CommPortIdentifier) portList.nextElement();

        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
             if (portId.getName().equals("COM7")) {
        //                if (portId.getName().equals("/dev/term/a")) {
                SimpleRead reader = new SimpleRead();
            }
        }
    }
}

public SimpleRead() {
    try {
        serialPort = (SerialPort) portId.open(this.getClass().getName(), 2000);
    } catch (PortInUseException e) {System.out.println(e);}
    try {
        inputStream = serialPort.getInputStream();
    } catch (IOException e) {System.out.println(e);}
try {
        serialPort.addEventListener(this);
} catch (TooManyListenersException e) {System.out.println(e);}
    serialPort.notifyOnDataAvailable(true);
    try {
        serialPort.setSerialPortParams(115200,
            SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1,
            SerialPort.PARITY_NONE);
    } catch (UnsupportedCommOperationException e) {System.out.println(e);}
    readThread = new Thread(this);
    readThread.start();
}

public void run() {
    try {
        //System.out.println("1");
        Thread.sleep(20000);
    } catch (InterruptedException e) {System.out.println(e);}
}

public void serialEvent(SerialPortEvent event) {
    switch(event.getEventType()) {
    case SerialPortEvent.BI:
    case SerialPortEvent.OE:
    case SerialPortEvent.FE:
    case SerialPortEvent.PE:
    case SerialPortEvent.CD:
    case SerialPortEvent.CTS:
    case SerialPortEvent.DSR:
    case SerialPortEvent.RI:
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
    case SerialPortEvent.DATA_AVAILABLE:
        byte[] readBuffer = new byte[4049];

        try {
            while (inputStream.available() > 0) {
                int numBytes = inputStream.read(readBuffer);
            }
            for(Byte bytenum: readBuffer)System.out.print(Integer.toHexString(bytenum)+" ");

        } catch (IOException e) {System.out.println(e);}
        break;
    }
    if (serialPort != null) {
                try {
                    // close the i/o streams.
                    inputStream.close();
                } catch (IOException ex) {
                    System.out.println(ex);
                }
                // Close the port.
                serialPort.close();
            }

}

}

这是部分结果(注意40后的字节数未成功读取) 1 2 3 4 5 6 7 8 9 abcdef 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 0 0 0 0 0 0 0

由于

1 个答案:

答案 0 :(得分:0)

串口发送部分结尾({0})。你必须先打破外表。你可以得到消息的下一部分。但是在你的代码中,这是不可能的,因为你关闭了流和端口。在收到所有数据之前循环执行。