3

我试图使用 rxtx API 从 com 端口读取数据。com 端口连接到一个微控制器,所以每次我按下微控制器板上的按钮时,它都会返回一系列从 0x01 到 0xff 的字节数。我想在我的 java 控制台上显示这些数字,但它似乎最多可以读取 0x40。之后的所有其他字节数似乎都丢失了。我很确定微控制器运行良好,因为我在另一个终端程序中进行了测试,然后给出了正确的结果。所以我怀疑我的输入流有问题。有没有人可以帮助我找到问题?以下是我的 java 代码,这是我从 google 找到的典型串行 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

谢谢

4

1 回答 1

0

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

于 2012-04-21T13:12:30.250 回答