Я не знаю протокол, используемый этим RFID-ридером, но похоже, что использовать java .io.Reader небезопасно. Если вы читаете необработанные байты в строку, вы рискуете повредить данные, когда они кодируются с использованием кодировки.
Похоже, что устройство отправляет ответный байт (в данном случае 02
), за которым следуют байты ASCII, представляющие идентификатор карты. Поэтому избегайте использования InputStreamReader; вместо этого читайте первый байт, затем читайте байты, пока не встретите символ новой строки и не преобразуйте их в строку. ( Не опускать кодировку при преобразовании - вы не хотите полагаться на кодировку системы по умолчанию!)
InputStream input = port.getInputStream();
int code = input.read();
if (code != 2) {
throw new IOException("Reader did not return expected code 2.");
}
ByteArrayOutputStream idBuffer = new ByteArrayOutputStream();
int b;
while ((b = input.read()) >= 0 && b != '\r' && b != '\n') {
idBuffer.write(b);
}
String cardID = idBuffer.toString(StandardCharsets.UTF_8);