bibliothèque Serial qui ne bloque pas loop

Bonjour

en faisant des essai j'ai constaté que la bibliothèque Serial inclut dans l ide Arduino bloque loop le temps de la communication.

existe t il des bibliothèques qui ne bloque pas ?

comment fait la bibliothèque pour séparé les caractere ?

est ce que le fichier rxtxSerial a al racine du dossier Arduino est le "driver" ?

bibliothèque Serial inclut dans l ide Arduino bloque loop le temps de la communication

Quelle instruction bloque?
Fais voir ton code

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();
}

Serial.begin(4800);

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.

Bonjour,

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" :open_mouth:

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();
}

Oué non mais la tu ne te sers pas de la librairie Serial

oué non mais la tu m'avance pas

RTFC : Read That Fucking Code (voir ma signature)

La plateforme arduino est opensource. Tu peux donc toi même regarder comment le code fonctione.

Serial = HardwareSerial est non bloquant parce que :

  • elle utilise les ressources hardware du MCU (UART) pour faire la liaison sériE
  • elle utilise un tampon géré sous interruption.

Pour ce que tu essaye de faire, sérialiser en soft :

  • il existe déjà une lib toute faite (SoftwareSerial)
  • c'est 100% bloquant

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

http://jeelabs.org/2010/01/06/pin-io-performance/