Pages: [1]   Go Down
Author Topic: bibliothèque Serial qui ne bloque pas loop  (Read 1478 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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" ?
Logged

France
Online Online
Faraday Member
**
Karma: 38
Posts: 3556
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
bibliothèque Serial inclut dans l ide Arduino bloque loop le temps de la communication
Quelle instruction bloque?
Fais voir ton code
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

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

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3643
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
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 ...
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

merci de vos réponses je comprends mieux alors j'ai mi que 64 caracteres et effectivement c'est "non bloquant"  smiley-surprise

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 ?

Code:
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();
}
« Last Edit: December 17, 2012, 06:15:16 am by 55lj5hh25 » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3643
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Offline Offline
Newbie
*
Karma: 0
Posts: 16
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oué non mais la tu m'avance pas
Logged

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

RTFC : Read That procreating 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

Logged

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
http://www.instructables.com/id/Arduino-is-Slow-and-how-to-fix-it/#step1
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: