См. http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html#available() inputtream.available - возвращает количество байтов, которое вы можете прочитать без блокировки (blocking = ожидание большего количества байтов)
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
В какой-то момент времени у вас есть (например,) 3 байта во внутреннем буфере, готовые для чтения.Вы читаете его, проверяете с помощью while (), что не больше ready байтов, и вы вышли из цикла.Чем вы печатаете 3 байта и ставите '\ n' ... Это причина ваших сломанных идентификаторов.Вы должны читать до тех пор, пока не заполните буфер нужного размера, блокируясь и ожидая, когда ваше устройство / com-порт предоставит достаточно байтов.
Используйте метод чтения (buf, off, len)
byte[] buf = new byte[12];
int len = is.read(buf,0,buf.length);
if (len != buf.length ) {
throw new RuntimeException("the stream is closed and i failed to read enough data");
}
Он будет внутренне блокироваться до тех пор, пока не будет прочитано необходимое количество байтов, или вернется раньше, если входной поток сообщит «я готов» до того, как будет достигнута сумма.