0

Samsung Express (4.1.2) の Bluetooth ソケットとの間で書き込みを読み取る際に奇妙な問題が発生しています。Google Nexus 4 (4.3) でアプリを実行すると、問題は発生しません。

ソケットで何らかのアクションを実行しようとすると、Logcat に「genlock attach lock open」というメッセージが表示されます。通常、「genlock close」ですぐに続きます。ここでの問題は、ソケットに書き込もうとすると「genlock close」が発生し、データは正常に送信されますが、ロックが再び開くまで入力ストリームの新しいデータにアクセスできないことです。

また、Logcat には多数の「availableNative」メッセージが表示されます。

コマンドを送信し、0.5 秒待って入力バッファの読み取りを試みるコードは次のとおりです。

public boolean ReadFaultTable()
{


    byte[] in_packet = new byte[100];

    int err_byte_count;
    int err_symp_count;


    if(!(BTCheck()))
            {
                Log.i(TAG,"ReadFaultTable() BT Fail!");
                //Toast.makeText(getApplicationContext(), "Socket not open for fault read", Toast.LENGTH_SHORT).show();
                return false;

            }


                byte [] out_packet = new byte[1];
                out_packet[0]= 0x0a;//READ_CURRENT_FAULT_CODES_CMD

                byte []full_packet=AddDRCheckSum(out_packet);

                connectedThread.clearBuffer();
                try{
                    Thread.sleep(200);
                   }
                catch(InterruptedException e){}

                connectedThread.write(full_packet);

                Log.i("Read Faults", "After Write");

            sleepForProcessingTime(500);
            Log.i("Read Faults", "0.5 Secs, Num Bytes = "+Integer.toString(connectedThread.bytesAvail()));


            if(connectedThread.bytesAvail() > 3)
            {
                //Log.i("Read Faults", "bytes avail = " + Integer.toString(connectedThread.bytesAvail()));
                for (int i =0;i<3;i++)
                {

                        Log.i("Read Faults", "In here");

                        if((in_packet[i]=connectedThread.readByte())==-1)
                        {
                            Log.i(TAG, "End of Input stream reached on iteration= "+ Integer.toString(i));
                            return false;
                        }
                        Log.i("Read Faults", "Byte read in =" +Integer.toHexString(in_packet[i]));
                }
            }
            else
            {
                Log.i("Read Faults", "No Bytes to read .. return false");
                return false;
            }

            /*
            if(connectedThread.bytesAvail() > 0)
            {
                in_packet= new byte[connectedThread.bytesAvail()];
                in_packet = connectedThread.read();
                Log.i("Read Faults","Bytes Read in =" + printCMD(in_packet));
            }
            */
            Log.i("Read Faults", "Made it here with "+ printCMD(in_packet));

            int fault_table_index =0;
              if (in_packet[0] == 0x0A && in_packet[1] == 0x0E )
              {
                  Log.i("Read Faults","in packet passed checks");
                  err_byte_count=in_packet[2];
                  fault_table= new boolean[err_byte_count*8];
                  Log.i("Read Faults","err byte count = "+ Integer.toString(err_byte_count));
                  for (int i=0;i<(err_byte_count);i++)
                  {
                      int val =connectedThread.readByte();
                      Log.i("Read Faults","Next byte read in =0x" + Integer.toHexString(val));
                      in_packet[3+i]=(byte)val;

                      int mask =0x01;
                      for (int x = 0; x < 8; x++)
                      {
                          if ((val & mask)== mask)
                          {
                              Log.i("Read Faults","Fault Index "+ Integer.toString(fault_table_index +1) + "true");
                              fault_table[fault_table_index++]=true;
                          }
                          else
                          {
                              Log.i("Read Faults","Fault Index "+ Integer.toString(fault_table_index +1) + "false");
                              fault_table[fault_table_index++] = false;
                          }
                          mask <<= 1;
                      }


                  }
                  Log.i("Read Faults","Made it to here");
                  in_packet[3 + err_byte_count] = (byte)connectedThread.readByte();

                  err_symp_count = in_packet[3 + err_byte_count];

                  symp_table = new byte[err_symp_count];
                  for (int i=0; i < err_symp_count; i++)
                  {
                      in_packet[3 + err_byte_count + 1 + i] = (byte)connectedThread.readByte();
                      symp_table[i] = in_packet[3 + err_byte_count + 1 + i];
                  }
                   return true;
              }
              else
              {
                  return false;
              }

    }

このコマンドを一度実行すると、バイトが inputStream に到達することはありませんが、コマンドを再度実行すると、最初からすべてのバイトが存在し、洪水の門が開かれるようになります。私は困惑しています。誰でも助けることができますか?(書き込みコマンドと読み取りコマンドはすべて、アプリ内の他の場所で機能し、Bluetooth ソケットが他のコマンドと応答に対して機能していることに注意してください。

さらに情報が必要な場合はお尋ねください。

4

1 に答える 1

0

ちょうど回避策を見つけました。何らかの理由で、電話は Bluetooth ソケットから一度に 1 バイト以上を読み取るという考えを好まなかった. そこで、受け入れ可能なパッチを提供するバイトごとのアプローチを実装しました。読み込む前にソケットで少なくとも 3 バイトをチェックしていたため、以前に 1 バイトが利用可能であると報告されたソケットを認識しませんでした (これは私の目的には意味があります)。Phone は、inputStream で使用可能な 1 バイトを継続的に報告するため、inputStream が 1 を報告している間に 1 バイトを取得します。誰かが説明を持っていれば、まだ説明に興味があります。ありがとう

于 2013-08-16T13:57:15.567 に答える