2016-12-21 2 views
0

Lorsque j'envoie une chaîne "M" à la fonction Device I call time d'où je fais ma chaîne.Les trois premiers caractères manquant de la chaîne lors de l'envoi à partir d'android via bluetooth

code:

` mManButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      man = 1; 

      clearScreen(); 

      mManButton.setBackgroundResource(R.color.button_pressed); 
      mStartButton.setBackgroundResource(R.color.button_default); 
      mCalButton.setBackgroundResource(R.color.button_default); 
      mTestButton.setBackgroundResource(R.color.button_default); 
      mLinearButtton.setBackgroundResource(R.color.button_default); 
      mAutoButton.setBackgroundResource(R.color.button_default); 
      // Send a message using content of the edit text widget 

      sendMessage("M"); 
      time(); 
     } 

    });` 

Ensuite, la fonction time() est appelée. Ici, si mon jour est lundi, le jour variable est défini sur 1. Cela signifie que dans cette fonction, je crée une chaîne contenant des valeurs de format de date. Cette chaîne commence à partir de "A" et se termine par "B".

code:

private void time() 
{ 
    int day = 0; 
    Date now = new Date(); 
    String sdf = new SimpleDateFormat("EEEE", Locale.ENGLISH).format(now); 

    switch(sdf){ 
     case ("Monday"): 
      day = 1; 
      break; 
     case("Tuesday"): 
      day = 2; 
      break; 
     case ("Wednesday"): 
      day = 3; 
      break; 
     case ("Thursday"): 
      day = 4; 
      break; 
     case("Friday"): 
      day = 5; 
      break; 
     case ("Saturday"): 
      day = 6; 
      break; 
     case("Sunday"): 
      day = 7; 
      break; 
    } 

    int mm = Calendar.getInstance().get(Calendar.MINUTE); 
    int HH = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); 
    int dd = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 
    int MM = Calendar.getInstance().get(Calendar.MONTH)+1; 
    int yy = Calendar.getInstance().get(Calendar.YEAR)%100; 

    if(mm<10) { 
     String time1 = "A" + "0" + mm + HH + "0" + day + dd + MM + yy + "B"; //suppose time1 = A041303211216B 
     tv7.setText("Please Wait.."); 
     int p = 0; 
     while (p < time1.length()) 
     { 
      char zx = time1.charAt(p); 
      String xz = String.valueOf(zx); 
      sendMessage(xz); 
      p++; 
     } 
    } 
    else if(mm>=10) { 
     String time2 = "A" + mm + HH + "0" + day + dd + MM + yy + "B"; **//suppose time2 = A151303211216B** 
     tv7.setText("Please Wait.."); 
     int k = 0; 
     while (k < time2.length()) 
     { 
      char zx = time2.charAt(k); 
      String xz = String.valueOf(zx); 
      sendMessage(xz); 
      k++; 
     } 
    } 
} 

Lorsque la chaîne est créée j'envoie chaque caractère de la chaîne à sendMessage().

code:

private void sendMessage(String message) { 
    // Check that we're actually connected before trying anything 
    if (mChatService.getState() != 
      com.example.hasani.bluetoothterminal.BluetoothChatService.STATE_CONNECTED) { 
     Toast.makeText(getActivity(), R.string.not_connected, Toast.LENGTH_SHORT).show(); 
     mStartButton.setBackgroundResource(R.color.button_default); 
     mCalButton.setBackgroundResource(R.color.button_default); 
     mTestButton.setBackgroundResource(R.color.button_default); 
     mManButton.setBackgroundResource(R.color.button_default); 
     mAutoButton.setBackgroundResource(R.color.button_default); 
     return; 
    } 

    // Check that there's actually something to send 
    if (message.length() > 0) { 
     // Get the message bytes and tell the BluetoothChatService to write 
     byte[] send = message.getBytes(); 
     mChatService.write(send); 

     // Reset out string buffer to zero and clear the edit text field 
     mOutStringBuffer.setLength(0); 
    } 
} 

La fonction d'écriture.

code:

public void write(byte[] out) { 
    // Create temporary object 
    ConnectedThread r; 
    // Synchronize a copy of the ConnectedThread 
    synchronized (this) { 
     if (mState != STATE_CONNECTED) return; 
     r = mConnectedThread; 
    } 
    // Perform the write unsynchronized 
    r.write(out); 
} 

Le Wite dans ConnectedThread code:

public void write(byte[] buffer) { 
     try { 
      mmOutStream.write(buffer); 

      // Share the sent message back to the UI Activity 
      mHandler.obtainMessage(com.example.hasani.bluetoothterminal.Constants.MESSAGE_WRITE, -1, -1, buffer) 
        .sendToTarget(); 
     } catch (IOException e) { 
      Log.e(TAG, "Exception during write", e); 
     } 
    } 

Comme il y a un rôle de gestionnaire en elle. Le problème est lors du débogage étape par étape, chaque caractère est envoyé à l'autre périphérique et ce périphérique reçoit chaque chaîne de "A" à "B", il n'y a donc pas de problème.

Mais quand je lance mon application android, après avoir envoyé "M", la fonction time() est appelée et la chaîne est envoyée mais les trois premiers caractères de la chaîne i.e; "Amm" n'est pas reçu par l'appareil. Je ne comprends toujours pas ce qui cause le problème. S'il vous plaît, aidez! Sera apprécié. Je vous remercie!

+0

En supposant que cela prenne quelques millisecondes pour se connecter, 'if (mState! = STATE_CONNECTED) retournera: 'abandonnera les caractères car il n'y a aucune tentative de réessayer. –

+0

Indice: tous les MAJUSCULES sont considérés comme du SCREAMING par de nombreuses personnes. Donc considéré comme impoli. Mieux vaut éviter cela et retravailler votre titre maintenant. – GhostCat

+1

@ KenY-N Alors dois-je supprimer cette partie? Cela fera-t-il la différence entre les fourmis Je suis nouveau dans Android alors je suis un peu confus. Je vous remercie. –

Répondre

1

Ohkay attends !!! J'ai la solution. Dans le cas où quelqu'un passerait par le même genre de situation. Dans mon onClickListener, j'appelle ma fonction time() après un délai de 5 secondes en utilisant un second gestionnaire.

Code Mon onClickListener est: fonction

mManButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

      man = 1; 
      linear = 0; 
      auto = 0; 
      cal = 0; 
      test = 0; 
      linear = 0; 
      clearScreen(); 

      mManButton.setBackgroundResource(R.color.button_pressed); 
      mStartButton.setBackgroundResource(R.color.button_default); 
      mCalButton.setBackgroundResource(R.color.button_default); 
      mTestButton.setBackgroundResource(R.color.button_default); 
      mLinearButtton.setBackgroundResource(R.color.button_default); 
      mAutoButton.setBackgroundResource(R.color.button_default); 
      // Send a message using content of the edit text widget 

      sendMessage("M"); 
      tv7.setText("Please wait...."); 
      Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        time(); 
       } 
      },5000); 
     } 

    }); 

Mon temps() est:

private void time() { 
    int day = 0; 
    Date now = new Date(); 
    String sdf = new SimpleDateFormat("EEEE", Locale.ENGLISH).format(now); 

    switch (sdf) { 

     case ("Monday"): 
      day = 1; 
      break; 
     case ("Tuesday"): 
      day = 2; 
      break; 
     case ("Wednesday"): 
      day = 3; 
      break; 
     case ("Thursday"): 
      day = 4; 
      break; 
     case ("Friday"): 
      day = 5; 
      break; 
     case ("Saturday"): 
      day = 6; 
      break; 
     case ("Sunday"): 
      day = 7; 
      break; 
    } 

    int mm = Calendar.getInstance().get(Calendar.MINUTE); 
    int HH = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); 
    int dd = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); 
    int MM = Calendar.getInstance().get(Calendar.MONTH)+1; 
    int yy = Calendar.getInstance().get(Calendar.YEAR)%100; 


    String A = "A"; 
    String min = String.format("%02d",mm); 
    String hour = String.format("%02d",HH); 
    String d = String.format("%02d",day); 
    String date = String.format("%02d",dd); 
    String month = String.format("%02d",MM); 
    String year = String.format("%02d",yy); 
    String B = "B"; 

    String time2 = A+min+hour+d+date+month+year+B; 
    sendMessage(time2); 
} 

Maintenant, je peux recevoir des données correctes que je REQUISE. Mon application fonctionne comme un charme.

0

Pour développer mon commentaire, le moyen le plus simple de gérer l'attente de connexion serait donc. Tout d'abord, le retour succès ou l'échec de write():

public boolean write(byte[] out) { 
    // Create temporary object 
    ConnectedThread r; 
    // Synchronize a copy of the ConnectedThread 
    synchronized (this) { 
     if (mState != STATE_CONNECTED) return false; 
     r = mConnectedThread; 
    } 
    // Perform the write unsynchronized 
    r.write(out); 
    return true; 
} 

Puis, en sendMessage(), remplacer mChatService.write(send); avec:

while (!mChatService.write(send)) 
{ 
    try { 
     Thread.sleep(10); 
    } 
    catch(InterruptedException ex) { 
     // Uncomment to just give up 
     //break; 
    } 
} 

Cela attendra encore 10 de millisecondes avant d'essayer de renverrons.

Il y a bien sûr beaucoup d'améliorations à faire comme ne permettant quelques tentatives avant d'abandonner complètement, etc.

Sur une note liée, avec le changement ci-dessus, vous pouvez probablement faire:

sendMessage(time1); 

au lieu de le faire un personnage à la fois.

Enfin, votre time mise en forme peut être simplifiée:

Calendar cal = Calendar.getInstance(); 
Date date = cal.getTime();    
SimpleDateFormat format = new SimpleDateFormat("mmHHcddMMYY"); 
String time = "A" + format1.format(date) + "B";    

Ou quelque chose comme ça. Voir this page for details.

+1

Merci pour l'aide! Lemme vérifier si cela aide ou non. Je vous ferai savoir. Merci beaucoup l'homme !!! –

+1

Buddy lors de l'ajout de Thread.sleep (10) dans "while" il est dit: "java.lang.InterruptedException" –

+0

Hmm, vous [pourrait avoir un problème plus sérieux] (https://examples.javacodegeeks.com/java-basics/exceptions/java-lang-interruptionedexception-comment-gérer-interrompuexception /)? Je vais mettre à jour avec un hack laid. –