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

  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : décembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut Serial Scilab / Arduino

    Bonjour à tous,

    je réalise un système d'acquisition de donnée avec un arduino, qui communique avec Scilab par liaison série 2000000 bauds (le plus rapide). pour l'exemple ici, l'arduino envoi une simple valeur de type int + un retour chariot à chaque envoi.

    J'ai un gros problème de rapidité: l'arduino est capable d'envoyer environ 3000 valeurs en 3.5secondes (j'ai un delay de 1ms), donc cohérent.

    La fonction readserial(h) permet de lire ces données très rapidement (0.5sec) mais comporte des ratés. Je lis donc caractère par caractère avec readserial(h,1) (je sais que la valeur suivant arrive dès que je détecte un retour chariot (code ascii(13))), mais cette dernière met beaucoup plus de temps, il me faut 45 secondes pour lire toutes mes données.

    Code Scilab : 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
    //clear;
    str(1)=''
    tableau=[]
    nbr=0;
    tps_now=0;
    n=1;
     
    //Phase d'init
    h=openserial(6,"2000000,n,8,1");  // On ouvre la communication sur le port 6
    tic();
    while serialstatus()(1)>0 // on vide le buffer au cas où
        readserial(h,1)
    end
    sleep(4000);    // sleep pour donner à l'arduino le temps de rebooter
    writeserial(h,'1'); sleep(10); //l'arduino n'envoie rien tant que Scilab ne lui envoie pas le chiffre '1'
     
    //Phase de lecture
    tic()
            while serialstatus()(1)>0
                in=readserial(h,1);
                str=str+in;
                    if in==ascii(10)
                          tableau(n)=str;
                          str='';
                          n=n+1;
                    end
            end
            tps=toc();
    closeserial(h)

    Code Arduino : 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
    int t_ini=0; int tps=0; int nbr=0; byte ind=0;
    char scilabmsg=0;
     
     
    boolean newData = false;
    int mvValue=0; int oldValue=0;
     
    void setup() {
        Serial.begin(2000000);
        delay(10);
        while(scilabmsg!='1'){
          if (Serial.available() > 0){
            scilabmsg = Serial.read();    
          }  
        }
        t_ini=millis();
    }
     
    void loop() {
          while(nbr<3000){
              nbr=nbr+1;
              tps=millis()-t_ini;
              Serial.println(tps);
              delay(1);
          }
    }

    Avez vous une idée pour améliorer la rapidité du système?

    Merci beaucoup!

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Ancien développeur matériel électronique (Hard/Soft)
    Inscrit en
    avril 2002
    Messages
    2 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ancien développeur matériel électronique (Hard/Soft)
    Secteur : Service public

    Informations forums :
    Inscription : avril 2002
    Messages : 2 433
    Points : 8 164
    Points
    8 164

    Par défaut

    Salut,
    Citation Envoyé par Mr_Quignon Voir le message
    je sais que la valeur suivant arrive dès que je détecte un retour chariot (code ascii(13))), mais cette dernière met beaucoup plus de temps, il me faut 45 secondes pour lire toutes mes données.
    Dans ton code Python, j'ai plus l'impression que tu détectes le code Ascii 10 '\n' au quel cas attention car j'ai l'impression que ton tableau comporte les données + les '\r' (de mémoire un println de Arduino envoie la chaîne de caractères + \r + \n)
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur mécanique
    Inscrit en
    décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : ingénieur mécanique

    Informations forums :
    Inscription : décembre 2018
    Messages : 4
    Points : 3
    Points
    3

    Par défaut

    Salut!

    Merci de ta réponse, le code c'est du Scilab et pour arduino c'est du C,

    oui il y a bien le /r dans le tableau de donnée, mais il disparait lors de la conversion du string en double.

    Pour info, j'ai pallié le problème en remplaçant le println par un print et en intercalant un caractère choisi entre chaque donnée (prenons "z").

    Tout est envoyé rapidement sans discontinuité sur le port série, je récupère la chaine complète de caractère où il y a toutes mes données avec un z intercalé entre chaque, je lis le tout avec readserial(h) qui va très vite, je stocke la chaine dans une variable, j'utilise ensuite strsplit pour découper la chaine avec le caractère "z", cela crée un tableau avec chacune de mes valeurs au format string, et je convertis avec strtod, j'ai mon tableau avec mes données.

    Je répete l'opération toute les 0.5sec et peut faire autre chose au fur et à mesure que mes donénes arrivent

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

Discussions similaires

  1. Communication entre Arduino et Matlab via serial
    Par Matwix dans le forum Arduino
    Réponses: 4
    Dernier message: 04/12/2017, 14h48
  2. Connexion Arduino & Raspberry en USB avec Serial
    Par Alexis55000 dans le forum Raspberry Pi
    Réponses: 20
    Dernier message: 22/12/2016, 23h00
  3. Réponses: 15
    Dernier message: 05/11/2016, 16h24
  4. Réponses: 3
    Dernier message: 20/10/2015, 08h28
  5. Comment interfacer Arduino avec Scilab sous Ubuntu ?
    Par jamalkamal dans le forum Scilab
    Réponses: 1
    Dernier message: 17/06/2015, 10h45

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