2016-12-21 11 views
0

Когда я отправляю строку «M» на устройство, я вызываю функцию времени, откуда я делаю свою строку.Первые три символа, отсутствующие в строке при отправке с android через bluetooth

Код:

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

    });` 

Тогда функция времени() вызывается. Здесь, если мой день - понедельник, тогда переменный день имеет значение 1. Это означает, что в этой функции я создаю строку, в которой есть значения формата даты. Эта строка начинается с «A» и заканчивается на «B».

Код:

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

Когда строка создается посылает каждые символы строки в SendMessage().

Код:

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

Функция записи.

Код:

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

Wite в ConnectedThread Код:

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

Как есть роль обработчика в нем. Проблема заключается в отладке шаг за шагом, каждый символ отправляется на другое устройство, и это устройство получает каждую строку от «А» до «В», поэтому проблем нет.

Но когда я запустил приложение для Android, после отправки «М» вызывается функция времени() и отправляется строка, но первые три символа строки i.e; «Amm» не принимается устройством. Я все еще не понимаю, что вызывает проблему. Пожалуйста, помогите !. Будет оценено. Спасибо!

+0

Предполагая, что для соединения требуется несколько миллисекунд, 'if (mState! = STATE_CONNECTED) return;' будет отбрасывать символы, поскольку попытки повторить не предпринимаются. –

+0

Подсказка: все ВЕРХНИЕ СЛУЧАЯ рассматривается как СКРИМАНИЕ многими людьми. Таким образом, считается грубым. Лучше избегайте этого и переработайте свой заголовок Теперь. – GhostCat

+1

@ KenY-N Итак, я должен удалить эту часть? Будет ли это иметь муравь. Я новичок в Android, поэтому я немного смущен. Спасибо. –

ответ

1

Ohkay wait !!! Я получил решение. Если кто-то переживает такую ​​же ситуацию. В моем onClickListener я вызываю функцию time() после 5-секундной задержки с использованием второго обработчика.

Мой onClickListener код: функция

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

    }); 

Мое время() является:

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

Теперь я могу получить правильные данные, как я требовал. Мое приложение работает как шарм.

0

Чтобы развернуть мой комментарий, самым простым способом обработки ожидающего соединения было бы таким образом. Во-первых, вернуть успех или неудачу из 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; 
} 

Тогда в sendMessage(), замените mChatService.write(send); с:

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

Это будет ждать еще 10 миллисекунд или около того, прежде чем пытаться повторно.

Там же, конечно, много улучшений, чтобы сделать, как только позволяет несколько попыток, прежде чем давать полностью, и т.д.

На соответствующую записку, с выше изменения, вероятно, можно сделать следующее:

sendMessage(time1); 

вместо того, чтобы делать это персонаж за раз.

Наконец, ваше time форматирование может быть упрощена:

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

Или что-то подобное. См. this page for details.

+1

Спасибо за помощь! Лемм проверяет, помогает это или нет. Я дам вам знать. Большое спасибо человеку !!! –

+1

При добавлении Thread.sleep (10) в «while» он говорит: «java.lang.InterruptedException» –

+0

Хм, у вас [может быть более серьезная проблема] (https://examples.javacodegeeks.com/java-basics/исключения/Java-Ланг-InterruptedException-хау в обращении-InterruptedException /)? Я уточню уродливым взломом. –