Я пытался читать с ком-порта, используя rxtx API.Ком-порт был подключен к микроконтроллеру, поэтому каждый раз, когда я нажимал кнопку на плате микроконтроллера, он возвращал мне серию байтов с числом от 0x01 до 0xff.Я хотел отобразить это число на своей консоли Java, но казалось, что он может читать до 0x40.Все остальные байтовые числа после, казалось, потерялись.Я был почти уверен, что микроконтроллер работал хорошо, так как я тестировал в другой терминальной программе, которая затем выдала правильный результат.Поэтому я подозреваю, что с моим входным потоком что-то не так.Есть ли кто-нибудь, кто мог бы любезно помочь мне найти проблему?Ниже приведен мой java-код, который представляет собой типичный пример кода чтения последовательного последовательного порта, который я нашел в Google.
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 3233 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f 40 0 0 0 0 0 0 0
Спасибо