收听流时丢失字符.. (java, BT, android)

LOST char while listen to stream.. (java, BT, android)

我正在尝试收听 BT Stream:

{
                InputStream is = socket.getInputStream();
                //ПОПЫТАЕМСЯ СОЗДАТЬ НОЫЙ ПОТОК
                LIS_STATE=1;
                byte[] buffer = new byte[1];
                int bytes;

                String readMess2="";
                while (true) {
                    try {


                         // нужное начало пакета
                        bytes = is.read(buffer);
                       //Если мы поймали C0 - || buffer[0] == (byte) 0x0D
                        if(buffer[0] == (byte) 0x0A || buffer[0] == (byte) 0x0D)
                        {
                            //testMessage= readMess2;
                            //Тут начитанная информация парситься
                            startWordGet = readMess2.charAt(0);
                            //если стартовый символ нормальный начинаем разбирать пакет
                            if(startWordGet==':')
                            {
                                //стркоа без стартвого символа
                                String message2=readMess2.substring(1);
                                //длинна ожидаемой полезной информации без  Str1.length()
                                String mesLength="";
                                mesLength=message2.substring(0,2);
                                //перводим в инт длинну
                                int messLength=0;
                                messLength=hexToDec(mesLength);
                                //Длина всей даты без : ODOA
                                int fullMessLenght=0;
                                fullMessLenght=message2.length();
                                //Длинна даты без длинны и CRC
                                int messLengthReal=0;
                                messLengthReal=fullMessLenght-4;
                                //  int messStopDataInt=0;
                                //Совпадает ли длинна декларируемая с реальной (передаваемая дата без транспорта)
                                if(messLength==messLengthReal)
                                {
                                    //проверяем CRC
                                          //переводим нашу HEX строку в массив байтов
                                          //  byte[] mesByteArr=null;
                                          //  mesByteArr = hexStringToByteArray(message2);
                                          //  byte reslutCrc2=0;
                                          //  reslutCrc2 =cheakCrcHexByteArr(mesByteArr);
                                          //   String resultcrc2string= Integer.toHexString(reslutCrc2);

                                    boolean resultCrc=cheakCrcHexString(message2);
                                    if(resultCrc)
                                    {
                                        //CRC совпалао
                                        int messStopDataInt=0;
                                        int crclength=2;
                                        messStopDataInt=fullMessLenght-crclength;
                                        String dataReal=message2.substring(2,messStopDataInt);
                                        int valueResive=hexToDec(dataReal);
                                        //Normal ways would be Integer.toString(i) or String.valueOf(i).
                                        //testMessage="M:"+resultCrc+" V: "+Integer.toString(valueResive);

                                     testMessage="OK:"+dataReal+" "+Integer.toString(valueResive);

                                    }
                                    else
                                    {
                                        //CRC не совпало
                                        //только для тестов
                                        //может для детекта стабильности конекта
                                        //но скорее всего все это уже есть на уровне блютуса
                                        int messStopDataInt=0;
                                        int crclength=2;
                                        messStopDataInt=fullMessLenght-crclength;
                                        String dataReal=message2.substring(2,messStopDataInt);
                                        int valueResive=hexToDec(dataReal);
                                        testMessage="CR:"+dataReal+" "+Integer.toString(valueResive);

                                    }

                                }
                                else
                                {
                                    //длина сообщения не соответсвует
                                    //данный else только для теста нужен

                                    int messStopDataInt=0;
                                    int crclength=2;
                                    messStopDataInt=fullMessLenght-crclength;
                                    String dataReal=message2.substring(2,messStopDataInt);
                                    int valueResive=hexToDec(dataReal);
                                    testMessage="LE:"+dataReal+" "+Integer.toString(valueResive);

                                }



                            }
                            else
                            {
                                //testMessage="ERROR : "; ошибка с аротовго слова
                               // char startWordB = readMess2.charAt(0);


                                //стркоа без стартвого символа
                                String message2=readMess2.substring(1);
                                //длинна ожидаемой полезной информации без  Str1.length()
                                String mesLength="";
                                mesLength=message2.substring(0,2);
                                //перводим в инт длинну
                                int messLength=0;
                                messLength=hexToDec(mesLength);
                                //Длина всей даты без : ODOA
                                int fullMessLenght=0;
                                fullMessLenght=message2.length();
                                //Длинна даты без длинны и CRC
                                int messLengthReal=0;
                                messLengthReal=fullMessLenght-4;


                                int messStopDataInt=0;
                                int crclength=2;
                                messStopDataInt=fullMessLenght-crclength;
                                String dataReal=message2.substring(2,messStopDataInt);
                                int valueResive=hexToDec(dataReal);
                                testMessage="ST:"+dataReal+" "+Integer.toString(valueResive);
                            }

                            readMess2="";

                     //       serviceNotifer("ADPTTO Service", "0A / 0D ("+co+") № " + byte_num + ": " +buffer[0],9);
                            // serviceNotifer("ADPTTO Service", "C0 № " + co + ": " +buffer[0],3);
                            // маркер конца команды - вернуть ответ в главный поток
                            // intent.putExtra(DashboardActivity.PARAM_STATUS, DashboardActivity.STATUS_FINISH);
                            // intent.putExtra(DashboardActivity.PARAM_RESULT, "BYTE №(" + byte_num + "): ");
                            // sendBroadcast(intent);
                            // byte_flag=0;
                           // FLAG_C0=1;

                           // serviceNotifer("ADPTTO Service ", " ("+co+") № " + byte_num + ": " +readMess2,8);

                        }
                        else
                        {
                            /*bytes = is.read(buffer);

                            //readMess2 = readMess2+new String(buffer, 0, 1);
                            readMess2 = readMess2+ new String (buffer, 0, bytes);
                           // serviceNotifer("ADPTTO Service", "BYTE ELSE ("+co+") № " + byte_num + ": " +buffer[0],10);
                            testMessage=readMess2;
                           // testMessage=readMess2;*/
                             readMess2 += "" + new String (buffer, 0, bytes);
                           // serviceNotifer("ADPTTO Service ", " ("+co+") № " + byte_num + ": " +readMess2,9);
                        }

一切正常 "fine" 但 90% 的时间 startWordGet = 空字符! 我无法理解..这是逻辑错误...

BT 设备发送:OCXX9CB4x

XX - 这部分每一步都会改变。 x - 这是 0xA0

使用此代码我得到了完整的消息,但是 .. strat sumbol ':' 丢失了 80-90% 的时间。我是 Java.

的菜鸟

所以这是我的逻辑错误!

我想当我从空 InputStream 读取时我会得到 "nothing" 并且我的读取缓冲区中不会有任何内容。但是在我的 byffer 中我有最后一个字节!这是一个停止字节 (0xA0),所以我尝试一次又一次地读取一个空字符串!