为什么我无法通过蓝牙Android发送大量数据?

时间:2015-11-10 09:29:22

标签: android bluetooth inputstream outputstream

我还是新手,我需要帮助来编码我的Android Studio> 0< 我不能发送长数据,虽然我改变了“缓冲区”的大小。我该怎么办?

这是接收方程序:

    public void run() {
        InputStream inputStream;

        try {
            inputStream = mBTSocket.getInputStream();
            while (!bStop) {
                byte[] buffer = new byte[1024];
                if (inputStream.available() > 0)
                {
                    inputStream.read(buffer);
                    int i = 0;
                    /*
                     * This is needed because new String(buffer) is taking the entire buffer i.e. 256 chars on Android 2.3.4 http://stackoverflow.com/a/8843462/1287554
                     */
                    for (i = 0; i < buffer.length && buffer[i] != 0; i++) {}
                    final String strInput = new String(buffer, 0, i);

                    /*
                     * If checked then receive text, better design would probably be to stop thread if unchecked and free resources, but this is a quick fix
                     */
                }
                Thread.sleep(500);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

这是寄件人程序:

    public void sendStringBT(String s)
    {
    try {
        mBTSocket.getOutputStream().write(s.getBytes());
        sleep();
        Toast.makeText(getApplicationContext(), "Sent...", Toast.LENGTH_SHORT).show();
        mBTSocket.getOutputStream().flush();
        } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }
}

这是我们如何调用发送数据:

    sendStringBT(dataPage6);    //send data via Bluetooth

1 个答案:

答案 0 :(得分:0)

我认为问题在于接收器的设计(在无限循环中使用Sleep ...)我解决了.net Xamarin中的BTL通信,但原理应该是相同的。 从btlInputStream读取必须快速,不能使用睡眠。你使用无限循环,在缓冲区中读取(OK)。立即将沙丘字节写入辅助大缓冲区(使用读/写光标)然后,例如,在计时器中处理数据(我假设您正在使用某些数据包协议)

     while (ContinueCycle)
      {
        int rxlen;
        lock (InternalBufferReadLock)
        {//Pouze rychle prectu a schovam si do pole
          rxlen = USBConnection.BulkTransfer(USBEndPointRead, InternalBufferRead, InternalBufferRead.Length, 0);
          Array.Copy(InternalBufferRead, TempBufferRead, rxlen);
        }
        lock (BufferReadLock)
        {
          for (int i = 2; i < rxlen; i++)
          {
            BufferRead[BufferReadWriteCursor] = TempBufferRead[i];
            BufferReadWriteCursor++;
          }
        }
      }

并在计时器中将其保存到正在处理数据的MainBuffer

if (tmpWriteCursor > tmpReadCursor)
{
   lock (BufferReadLock)
   {
      int newBytes = tmpWriteCursor - tmpReadCursor;
      for (int i = 0; i < newBytes; i++)
      {
         BufferReadMain[BufferReadReadCursor] = BufferRead[BufferReadReadCursor++];
      }
   } 
}

...

 bool newline = false;
                string tmpRadek = "";
                int lastLineIndex = 0;
                List<string> list = new List<string>();

                for (int i = LastWriteLineIndex; i < tmpWriteCursor; i++)
                {
                    if (BufferReadMain[i] >= 32 && BufferReadMain[i] <= 255)
                    {
                        tmpRadek += (char)BufferReadMain[i];
                    }
                    else if (BufferReadMain[i] == 13) newline  = true;
                    else if (BufferReadMain[i] == 10)
                    {
                        if (newline)
                        {
                            newline = false;
                            list.Add(Utils.GetFormatedDateTime(DateTime.Now) + "   " + tmpRadek);
                            tmpRadek = "";
                            lastLineIndex = i + 1;
                        }
                    }
                    else
                    {
                        tmpRadek += "?" + BufferReadMain[i].ToString() + "?";
                    }
                }