j'ai pas de code j'en ai fait un pour montrer:
la fonction tx envoie une phrase a l'ordi, elle empêche le clignotement de la diode de a fonction clignote.
donc : la bibliothèque serial est "bloquante" ( je sais pas si le terme et bon, mais y a surement un terme officiel pour ce genre de comportement )
tu peux mettre la fonction tx en commentaire pour constater que ça clignote alors plus vite.
il me faudrait une bibliothèque qui peut envoyer des valeurs sans bloquer la boucle car pour contrôler une moteur pas a pas qui tourne vite, il faut que la boucle soit tres souvent rafraîchie.
void tx(){
int i = 0;
while(i++ < 10){
Serial.print("le code envoie a chaque boucle cette chaine de caractere 10 fois . peu importe ce qu elle contient mais il faut qu elle soit longue pour bien voir que ça bloque la boucle\n");
}
}
boolean led = false;
unsigned long aa = 0;
void clignote (){
if(aa < micros() - 100000){
digitalWrite(13,led = !led );
aa = micros();
}
}
void setup() {
Serial.begin(4800);
pinMode(13,OUTPUT);
}
void loop() {
tx();
clignote();
}
Essaye à 115200 ... Tu envois je sais pas combien de caractères 10 fois à une vitesse très basse ! Chaque caractère nécessite un byte, à la louche ça fait quasiment 1000 caractères x 8 bit soit 8 000 bits à 4800 bits/s ... Y'a pas de miracle !
je voudrais etre sur que loop n'est pas bloqué ne serait ce que une seul milliseconde ? c'est trop demander a une carte Arduino ? je parle bien d une carte Arduino
La bibliothèque Serial d'Arduino n'est pas bloquante. Si tu veux t'en assurer : RTFC. hardware\arduino\cores\arduino\HardwareSerial.cpp
Il y a un tampon d'emission et un tampon de réception qui permettent de gérer emission et réception sous interruption sans bloquer le code.
A condition d'être raisonnable.
Sur un micro comme l'ATmega, la RAM est limitée. Chacun des tampons d’émission par défaut sur un ATmega328P (Arduino UNO) n'est que de 64 caractères.
Donc quand on lui en demande trop, il faut faire la queue, c'est normal.
A toi d'être malin et de découper ton code de manière intelligente et de ne pas demander à une Arduino d'avoir 4GB de RAM comme Windows7.
En conclusion : ce n'est pas la lib Serial qui bloque ton exemple, c'est ton propre code.
Juste pour venir en complément de barbudor qui a déjà bien expliqué le problème.
Ton texte fait 172 caractères, le buffer interne du port série fait 64 caractères (16 si tu travaille avec une carte arduino d'ancienne génération).
Il faut donc remplir 3 fois le buffer pour que le texte soit transmit dans son intégralité.
A 4800 bauds par secondes tu transmet 4800 / 10 = 480 octets par secondes.
Il faut donc 64 / 480 = 133 millisecondes par bloc de 64 octets, soit 350ms au final pour 172 octets ...
(1 octets = 10 bits (bit de start, 8 bits de données, 1 bit de stop))
Si en plus tu multiplies le tout par 10 et que tu fait ça en boucle ... bonjours la cata ...
c'est trop demander a une carte Arduino ?
En conclusion: oui
Quelque soit la taille de ton buffer tu reste limité par la vitesse physique de transmission ...
merci de vos réponses je comprends mieux alors j'ai mi que 64 caracteres et effectivement c'est "non bloquant"
j'ai fait un essai d' envoie de caracteres avec le code suivant, mais je reçoit pas les caractere attendu.
je ne connais pas quels sont les bits de start et stop.
est il possible de modifier ce code pour qu il fonctionne ?
quel element de l'ordi gere la reception des données ? comment l’exactitude du rythme est garanti ?
je n'arrive pas a trouver ça dans le fichier RTFC. hardware\arduino\cores\arduino\HardwareSerial.cpp
que signifie rtfc ?
Quel ide utiliser ? j'utilise celui Arduino mais pour eviter d avoir a charger le code dans la carte Arduino a chaque fois pour voir si ça marche ou non ?
const char mot[8] = { 'a' , 'b', 'c', 'd', 'e', 'f', 'g', '\0' };
const int taille = sizeof(mot);
const int tx = 1;
const int ml = 21; // 1 bit tout les 21 microseconds pour afficher "absdefg" dans le moniteur reglé a 4800 baud
unsigned long curr = 0;
int posc = 0, mask = 1;
void suite (){
if( curr < micros() ){
next();
curr += ml;
}
}
void next(){
if(mask == 256){
digitalWrite( tx, 1); // bit de fin
}else if(mask < 256 && mask > 0){
digitalWrite( tx, (mot[posc] & mask) == mask ); // caractere
}else{
digitalWrite( tx, 0); // bit d'intro
posc = ( posc + 1 ) % taille; // caractere suivant
mask = 512;
}
mask /= 2;
}
void setup() {
pinMode(tx, OUTPUT);
}
void loop() {
suite();
}
Faire du software serial avec les fonctions arduino -> pire idée du siècle ...
Et faire du software serial -> 100% bloquant et 100% foireux si mal codé.