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

Scilab Discussion :

Serial Scilab / Arduino


Sujet :

Scilab

  1. #1
    Candidat au Club
    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

    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
    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