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
ありがとう