侦听流时丢失字符.(java、BT、android)



我正在尝试收听BT流:

{
                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);
                        }

一切正常,但90%的时间startWordGet=空字符!我听不懂。。这是逻辑错误。。。

BT设备发送:OCXX9CB4x

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

有了这个代码,我得到了完整的信息,但是。。strat sumbol":"有80-90%的时间是失踪的。我不懂Java。

所以这是我的逻辑错误!

我想当我读取空的InputStream表单时,我会得到"什么都没有",读取缓冲区中也不会有任何内容。但在我的密码里,我有最后一个字节!它是一个停止字节(0xA0),所以我一次又一次地尝试读取一个空字符串!

相关内容

  • 没有找到相关文章

最新更新