IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

Android - carte HC05 BlueTooth : problème pour envoyer un message


Sujet :

API standards et tierces Android

  1. #1
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut Android - carte HC05 BlueTooth : problème pour envoyer un message
    Bonjour,
    malgré de nombreux essais et de nombreuses recherches sur le net, je n'arrive pas en transmettre un seul caractère de ma tablette Android vers une carte HC05 BlueTooth:
    Mes 2 appareils sont bien reconnus et appairés. La demande de connexion semble bien se passer mais lorsque j'arrive à la procédure d'envoi, le prog se plante.
    "lettre" est un String que je saisis dans un EditText
    Etant débutant en Java, je suis sûr que je me plante allègrement, mais si je pouvais avoir un peu d'aide.
    Voici la procédure qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public void envoiMessage (View v) {
            lettre = this.cmd.getText().toString();
             try {
                sendStream.write(lettre.getBytes());
                sendStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    Merci
    Michel

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Pas de message d'erreur dans la console ?

    Peut être mettre le code dans un thread pour que ça soit en asynchrone déjà.

    Côté Arduino tu traites comment la fin de message ?

  3. #3
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Merci pour cette réponse.
    J'ai du mal à comprendre pourquoi lancer un "thread" puisque cette procédure est appelée lorsque j'appuie sur un bouton d'envoi?
    En fait c'est cette instruction qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sendStream.write(lettre.getBytes());
    car si je remplace celle-ci par un "Toast" cela fonctionne.

    Le code côté Arduino, tout simple, est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <SoftwareSerial.h>
    const int btTx = 2;
    const int btRx = 3;
    const int led10 = 10;
    const int led11 = 11;
    const int led12 = 12;
    const int led13 = 13;
    char c = ' ';
     
    SoftwareSerial btLien(btTx, btRx); // HC05_RX, HC05_TX
     
    void setup() {
      pinMode(led10,OUTPUT);
      pinMode(led11,OUTPUT);
      pinMode(led12,OUTPUT);
      pinMode(led13,OUTPUT);
      Serial.begin(38400);
      Serial.println("Liaison PC OK");
      // set the data rate for the SoftwareSerial port
      btLien.begin(38400);
      Serial.println("Liaison BT OK");
    }
     
    void loop() {
      if (btLien.available()){
        c=btLien.read();
        Serial.write(c);
      }
      if (Serial.available()){
        c = Serial.read();
        btLien.write(c);
      }
      if ((c == 'A') || (c == 'B') || (c == 'C') || (c == 'D')) { 
        switch (c) {
          case 'A': digitalWrite(led10,HIGH);
                    break;
          case 'B': digitalWrite(led11,HIGH);
                    break;
          case 'C': digitalWrite(led12,HIGH);
                    break;
          case 'D': digitalWrite(led13,HIGH);
                    break;
        }
        delay(1000);
        digitalWrite(led10,LOW);
        digitalWrite(led11,LOW);
        digitalWrite(led12,LOW);
        digitalWrite(led13,LOW);
      }
    }
    Comme tu le vois, pour l'instant je n'essaie d'envoyer qu'un seul caractère.
    Si nécessaire, je peux poster tout mon code Java?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Côté Arduino, ça me semble bon.

    Je pencherai pour un problème de connexion au device.
    L'appairage est nécessaire, mais non suffisant.

    Comment tu te connectes au device ? tu fais un scan au préalable ?

    Si ça plante côté Droid, tu dois avoir une stack dans la console Android Studio.
    Ou adb logcat en console.

  5. #5
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Je me permets de t'envoyer le code Java car je n'arrive pas à trouver où se situe l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    package mormic.bluetest2;
     
    import android.bluetooth.BluetoothSocket;
    import android.support.v7.app.ActionBarActivity;
    import android.bluetooth.BluetoothAdapter;
    import android.bluetooth.BluetoothDevice;
    import android.content.Context;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.AdapterView.OnItemClickListener;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.Set;
    import java.util.UUID;
     
    public class MainActivity extends ActionBarActivity implements OnItemClickListener {
        BluetoothSocket mmSocket = null;
        BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
        Set<BluetoothDevice> devices = ba.getBondedDevices();
        BluetoothDevice [] tbDevices = (BluetoothDevice[]) devices.toArray(new BluetoothDevice[devices.size()]);
        OutputStream sendStream = null;
        Button btlst, btEnvoi;
        ListView lv;
        TextView msgSelect;
        EditText cmd;
        ArrayList<String> listItems = new ArrayList<String>();
        public String lettre;
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Context context = getApplicationContext();
     
            btlst = (Button)findViewById(R.id.btListe);
            btEnvoi = (Button) findViewById(R.id.envoi);
            lv = (ListView)findViewById(R.id.liste);
            msgSelect = (TextView)findViewById(R.id.select);
            cmd = (EditText)findViewById(R.id.commande);
            //Est-ce que le Bluetooth est supporté
            if (ba == null)
                Toast.makeText(context, "Pas de Bluetooth", Toast.LENGTH_SHORT).show();
            else {
                    //Si oui est-ce que le Bluetooth est en fonction
                if (!ba.isEnabled()) {
                    Toast.makeText(context, "Le Bluetooth est présent mais n'est pas activé", Toast.LENGTH_LONG).show();
                    //Rend le Bluetooth actif
                    Intent active = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(active, 0);
                }
                else
                    Toast.makeText(context,ba.getName() + "\n" + ba.getAddress(),Toast.LENGTH_LONG).show();
            }
        }
        //affiche une liste des équipements apairés
        public void afficheListe(View v){
            for (BluetoothDevice bd : devices) {
                listItems.add(bd.getName() + "\n" + bd.getAddress());
           }
            final ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, listItems);
            lv.setAdapter(adapter);
            lv.setOnItemClickListener(this);
        }
        //sélectionne un équipement
        public void onItemClick (AdapterView<?>adapter, View v, int position, long id) {
                 // Affichage des données de l'équipement sélectionné dans un textview
            msgSelect.setText("Position " + Integer.toString(position) + "\n" + listItems.get(position));
            //Crée le socket
           try {
                mmSocket = tbDevices[position].createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            connect();
        }
     
        public void connect() {
            new Thread() {
                @Override public void run() {
                    try {
                        mmSocket.connect();
                    } catch (IOException connectException) {
                        try {
                            mmSocket.close();
                        } catch (IOException closeException) { }
                        return;
                    }
                }
            }.start();
        }
     
        public void envoiMessage (View v) {
            lettre = this.cmd.getText().toString();
             try {
                sendStream.write(lettre.getBytes());
                sendStream.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
     
    }
    Je joins aussi un fichier contenant le message d'erreur apparaissant dans logcat lorsque j'essaie d'envoyer un "D"

    Merci de ton aide

    Michel
    Fichiers attachés Fichiers attachés

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    Ok, le log est clair : ta socket est null.

    Un conseil pour l'initialisation de tes var BT passe par des méthodes avec du code asynchrone (pas via init static)
    et check bien l'état avec du logcat pour avoir des trace pour les différents états.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    J'ai loupé un truc, mais où c'est que tu fais le lien entre ta socket et ton output stream ?

  8. #8
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Merci UbuntuMan pour le temps que tu passes à m' aider.
    C'est vrai, je vois bien qu'il faut un lien entre mon mmSocket et mon sendStream mais je ne sais pas comment procéder.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 141
    Points : 177
    Points
    177
    Par défaut
    En gros la logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BluetoothSocket clientSocket = clientSocket = device.createRfcommSocketToServiceRecord(uuid);
    ....
    clientSocket.connect();
    ....
    inputStream = socket.getInputStream();
    outputStream = socket.getOutputStream();
    ....
    outputStream.write(byteArray);
    ....

  10. #10
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Voilà j'ai modifié ma procédure ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void envoiMessage (View v) {
            lettre = cmd.getText().toString();
             try {
                OutputStream opS = mmSocket.getOutputStream();
                opS.write(lettre.getBytes());
             } catch (IOException e) {
                e.printStackTrace();
            }
        }
    et enfin j'ai pu voir une lettre passer.

    Il me reste un problème: j'ai créé un bouton pour arrêter ma connexion BT mais là aussi lorsque je lance la procédure mmSocket.close() le prog se plante.

    Je suis conscient d'être nul en la matière comme ma Socket mais je n'imaginais pas que pour simplement envoyer un caractère sur un réseau BT il faille être BAC+5.
    Je comprends la nécessité des "thread", des procédures asynchrones mais est-ce vraiment utile pour commander un circuit électronique simple comme un relais par exemple?

    Si tu pouvais me mettre sur la voie pour ma déconnexion, je t'en serais reconnaissant.

    Cordialement
    Michel

  11. #11
    Membre habitué
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 293
    Points : 145
    Points
    145
    Par défaut
    Je retire ma dernière question, j'avais (encore) oublié la relation entre mon button XML et la procédure JAVA.
    Donc pour l'instant tout fonctionne comme je le désirais.
    Je vais poursuivre mon étude de JAVA pour mieux appréhender les notions de Threads et de code asynchrone tout en finalisant mon projet électronique.

    Grand merci pour vos précieuses aides.

    Michel

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour envoyer un message
    Par HDThoreau dans le forum Débuter
    Réponses: 7
    Dernier message: 29/09/2012, 22h11
  2. Problème pour envoyer un e-mail
    Par Djohn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 30/07/2007, 18h59
  3. Problème pour envoyer un formulaire
    Par gloop1 dans le forum Langage
    Réponses: 20
    Dernier message: 03/05/2007, 14h20
  4. [outlook express] problème pour envoyer messages
    Par Piccolo_son dans le forum Outlook Express / Windows Mail
    Réponses: 3
    Dernier message: 08/02/2007, 21h14
  5. Réponses: 1
    Dernier message: 03/12/2005, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo