Я использую библиотеку эмулятора терминала для создания терминала, а затем я использую его для отправки данных, введенных через последовательный порт на последовательное устройство. В библиотеке можно увидеть здесь.
Когда я ввожу данные в терминал, посылается/принимается странная серия символов. Я думаю, что символ замены Юникода отправляется через последовательный порт, серийное устройство не знает, что это такое, и возвращает ~ 0.
Снимок экрана о том, что появляется в терминале, когда я пишу "test": 
И журнал, показывающий отправленные строки и полученные данные. 
Я создаю EmulatorView, это вид терминала. он упоминает алмазы здесь.
private void sendText(CharSequence text) {
                int n = text.length();
                char c;
                try {
                    for(int i = 0; i < n; i++) {
                        c = text.charAt(i);
                        if (Character.isHighSurrogate(c)) {
                            int codePoint;
                            if (++i < n) {
                                codePoint = Character.toCodePoint(c, text.charAt(i));
                            } else {
                                // Unicode Replacement Glyph, aka white question mark in black diamond.
                                codePoint = '\ufffd';
                            }
                            mapAndSend(codePoint);
                        } else {
                            mapAndSend(c);
                        }
                    }
                } catch (IOException e) {
                    Log.e(TAG, "error writing ", e);
                }
            }
Есть ли способ исправить это? Может ли кто-нибудь увидеть в классе библиотеки, почему это происходит? Как я могу ссылаться на в java, чтобы даже разобрать его, если захочу? Я не могу сказать, если (! Str.contains( "" ) я его принимаю.
Когда я набираю терминал, он запускается:
public void write(byte[] bytes, int offset, int count) {
 String str;
try {
    str = new String(bytes, "UTF-8");
      Log.d(TAG, "data received in write: " +str );
      GraphicsTerminalActivity.sendOverSerial(str.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
    Log.d(TAG, "exception" );
    e.printStackTrace();
}
        // appendToEmulator(bytes, 0, bytes.length);
 return;
}
Это то, что я вызываю для отправки данных. sendData (Byte [] data) - это метод библиотеки.
public static void sendOverSerial(byte[] data) {
        String str;
        try {
            str = new String(data,"UTF-8");
             if(mSelectedAdapter !=null && data !=null){
                 Log.d(TAG, "send over serial string==== " + str);
                mSelectedAdapter.sendData(str.getBytes("UTF-8"));
                 }
        } catch (UnsupportedEncodingException e) {
            Log.d(TAG, "exception");
            e.printStackTrace();
        }
    }
Как только данные будут отправлены, ответ будет получен здесь:
public void onDataReceived(int id, byte[] data) {
        try {
            dataReceived = new String(data, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            Log.d(TAG, "exception");
            e.printStackTrace();
        }
        try {
            dataReceivedByte = dataReceived.getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            Log.d(TAG, "exception");
            e.printStackTrace();
        }
        statusBool = true;
        Log.d(TAG, "in data received " + dataReceived);
        ((MyBAIsWrapper) bis).renew(data);
        runOnUiThread(new Runnable(){
            @Override
            public void run() {
                mSession.appendToEmulator(dataReceivedByte, 0, dataReceivedByte.length);
            }});
    viewHandler.post(updateView);
}
Соответствующий раздел класса библиотеки, в котором записаны символы:
Соответствующий раздел класса:
private void sendText(CharSequence text) {
                int n = text.length();
                char c;
                try {
                    for(int i = 0; i < n; i++) {
                        c = text.charAt(i);
                        if (Character.isHighSurrogate(c)) {
                            int codePoint;
                            if (++i < n) {
                                codePoint = Character.toCodePoint(c, text.charAt(i));
                            } else {
                                // Unicode Replacement Glyph, aka white question mark in black diamond.
                                codePoint = '\ufffd';
                            }
                            mapAndSend(codePoint);
                        } else {
                            mapAndSend(c);
                        }
                    }
                } catch (IOException e) {
                    Log.e(TAG, "error writing ", e);
                }
            }
            private void mapAndSend(int c) throws IOException {
                int result = mKeyListener.mapControlChar(c);
                if (result < TermKeyListener.KEYCODE_OFFSET) {
                    mTermSession.write(result);
                } else {
                    mKeyListener.handleKeyCode(result - TermKeyListener.KEYCODE_OFFSET, getKeypadApplicationMode());
                }
                clearSpecialKeyStatus();
            }
