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