【问题标题】:LOST char while listen to stream.. (java, BT, android)听流时丢失字符.. (java, BT, android)
【发布时间】:2015-11-09 13:28:02
【问题描述】:

我正在尝试收听 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);
                        }

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

BT设备发送:OCXX9CB4x

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

使用此代码,我会收到完整的消息,但是 ..stra sumbol ':' 缺少 80-90% 的时间。我是 Java 的菜鸟。

【问题讨论】:

  • 什么叫空字符?是0 值吗?
  • 空字符 = null。现在我(在“/* */”的帮助下)明白了......如果我评论这个: testMessage="ST:"+dataReal+" "+Integer.toString(valueResive);我会得到所有的数据(没有丢失的数据)。当 InputStream 为空时 - 我什么也没读。所以最后一个字节 = 0xA0 -> 但我的 String readMess2 是空的 - 没有字符。所以我得到这个错误;但我忘了清理字符串消息2!这让我觉得我丢失了一些数据......并且长度和CRC控制就像魔术一样工作))因为没有第一个字符长度变化。我noooob))
  • 字符可以为空但不能为字符

标签: java android bluetooth stream


【解决方案1】:

所以这是我的逻辑错误!

我认为当我从空的 InputStream 中读取时,我会得到“什么都没有”,并且我的读取缓冲区中不会有任何内容。但是在我的 byffer 中插入了最后一个字节!这是一个停止字节(0xA0),所以我一次又一次地尝试读取一个空字符串!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多