[Linux][Arduino UnoR3][1.8.9] Le programme ne fonctionne que lorsque le serial monitor est activé
Bonjour,
Je viens de terminer les examens avec mes élèves, et il s'est passé un truc que je n'avais pas remarqué chez moi: notre programme ne semble pouvoir communiquer avec l'Arduino que
lorsque le "Serial Monitor" est activé :{
C'est une de mes élèves qui me l'a fait remarquer ^^
Pendant mes tests j'utilisais effectivement le "Serial Monitor" pour "savoir" ce que faisait l'Arduino de son côté...
Le programme qui communique avec l'Arduino est écrit en C.
Voici la fonction qui "configure" le port série, je ne suis pas certain des paramètres utilisés, au vu de ce qu'il nous arrive.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| int ConfigureArduino(char *pFichier,speed_t vitesse)
{
int portdesc; // descripteur de l'Arduino
struct termios options; // caractéristiques d'un terminal
portdesc=open(pFichier, O_RDWR | O_NOCTTY | O_NONBLOCK); // Ni la lecture ni l'écriture ne seront bloquantes
if(portdesc>0)
{
fcntl(portdesc,F_SETFL,0); // réinitialiser le port série
// Il faut que les deux équipements fonctionnent à la même "vitesse"...
tcgetattr(portdesc, &options);
cfsetispeed(&options, vitesse);
cfsetospeed(&options, vitesse);
options.c_cflag |= (CLOCAL | CREAD);
tcsetattr(portdesc, TCSANOW, &options);
}
return portdesc;
} |
En fouinant dans les extraits de code fonctionnels (et éprouvés ^^) je suis retombé sur ceci que j'avais oublié de communiquer à mes élèves qui solutionnerait le soucis :{ comme quoi écrire sur un forum et rassembler ses mémoires des fois est fort utile ^^
Code:
1 2 3 4 5
|
int RTS_flag;
RTS_flag = TIOCM_DTR; // l'Arduino utilise le DTR (Date Transmit Ready)
ioctl(portdesc,TIOCMBIS,&RTS_flag); |
Du coup... voilà je pense avoir résolu le soucis ^^
Oui bin non c'est pas gagné :{ (après 20 minutes d'essais)
Du coup je suis toujours dans l'expectative: d'où vient le fait que l'Arduino semble ne pas établir de connexion série sauf quand le "Serial Monitor" est ouvert ?
Voici la partie setup de l'Arduino
Code:
1 2 3 4 5
| Serial.begin(115200);
digitalWrite(LED_BUILTIN, LOW);
while(Serial.available()) Serial.read(); // vider le "buffer"
Serial.flush(); |
et j'utilise la fonction Serial.readString() dans la fonction loop().