2015-11-10 1 views
3

Je suis encore débutant et j'ai besoin d'aide pour coder mon Android Studio> 0 < Je ne peux pas envoyer de données longues, bien que je change la taille de "tampon". Que devrais-je faire ?Pourquoi je ne peux pas envoyer une grande quantité de données via Bluetooth Android?

C'est le programme récepteur:

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

    } 

Ce sont le programme de l'expéditeur:

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

Voici comment nous appelons à envoyer des données:

sendStringBT(dataPage6); //send data via Bluetooth 
+0

Avez-vous trouvé une solution? – Majkl

+0

Cher @Majkl, désolé pour ma réponse tardive> 0 <. Ya, tu as raison! Après avoir supprimé "sleep()" dans le programme de l'expéditeur, je peux envoyer beaucoup de données. Merci beaucoup !^- ^. Mais, j'ai un autre problème> 0 <. Après avoir envoyé des données d'Android via Bluetooth à Arduino (par HC-05). Il y a toujours des données manquantes, bien que je diminue la vitesse de transmission. Avoir une autre idée? Merci^-^ – Dian

+0

Je n'utilise pas Arduino. Je suppose que c'est le problème dans les paramètres de communication des deux appareils, qui doivent être les mêmes (débit en bauds, bit de parité ...). Créer une nouvelle question, peut-être que quelqu'un saura. – Majkl

Répondre

0

Je pense que la problème est dans la conception du récepteur (en utilisant le sommeil dans un cycle sans fin ...) J'ai résolu la communication BTL en .net Xam arin, mais le principe devrait être le même. La lecture de btlInputStream doit être rapide et ne peut pas utiliser le mode veille. Vous utilisez un cycle sans fin, en lisant dans le tampon (OK). Immédiatement octets de dunes à un tampon grand auxiliaire (utilisation en lecture/curseur d'écriture) et puis, par exemple, dans le traitement de la minuterie données (je suppose que vous utilisez un protocole de paquets)

 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++; 
      } 
     } 
     } 

et minuterie de l'enregistrer sur MainBuffer à partir de laquelle les données sont en cours de traitement

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() + "?"; 
        } 
       }