Arduino Forum

International => Français => Topic started by: Geeks on Apr 03, 2012, 11:11 am

Title: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 11:11 am
Bonjour,

Je cherche maintenant depuis quelques jours à faire communiquer deux cartes arduino entre elle au travers d'une liaison RS232.

Point de vue schéma, on me corrigera si j'ai faux...
La masse (GND) est commune.
Le TX de la carte arduino méga (le maître) est reliée au RX de la carte arduino uno (Esclave).
Le RX de la carte arduino méga (le maître) est reliée au TX de la carte arduino uno (Esclave).

Ensuite, j'ai pas su trouvé d'autres informations.
Il me faut, par exemple mettre un bouton sur la méga et lorsque j'appuie sur le bouton, la diode reliée à la pin 13 de la uno s'alumme. Si je relache le bouton relier à la carte méga, la diode pin 13 de la carte uno s'éteint.

Il faut noté que dans mon projet j'utilise aussi un écran en mode I2C sur la méga. L'écran est reliée au SDA et SCL et fonctionne parfaitement sous la librairie wire().

Est-ce que quelqu'un peut m'aider à constituer un petit programme simple (au pire une piste épuré) pour la méga et pour la uno afin que je puisse avancer dans mon projet ?

Merci d'avance.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: barbudor on Apr 03, 2012, 12:04 pm
Quote
Le TX de la carte arduino méga (le maître) est reliée au RX de la carte arduino uno (Esclave).
Le RX de la carte arduino méga (le maître) est reliée au TX de la carte arduino uno (Esclave).


Mais est-ce que les Arduino sont aussi reliées au PC ?
Dans ce cas, l'Arduino n'ayant qu'un seul port série il y a un conflit qui peut empêcher la bonne réception du signal.

Quote
au travers d'une liaison RS232.

Juste un détail de terminologie : RS232 signifie une liaison série asynchrone avec des niveaux électriques spécifiques (le niveau haut est représentée par une tension négative < 3V; le niveau bas par une tension positive > 3V).
C'est pour cela qu'il ne faut pas relier le port série de l'Arduino en direct sur un RS232 de PC ou d'équipment exterieur mais utiliser un MAX232 ou dérivé.
Nativement la liaison série de l'Arduino est en niveau TTL (niveau haut +5V; niveau bas 0V) et il n'y a pas de problème à relier 2 Arduino comme cela tant qu'elles sont alimentées par la même alim et sur courte distance. Attention toutefois par exemple entre une Arduino (5V) et une ArduinoPro (3V3)....

Ceci étant dit, sur la page Examples (http://arduino.cc/en/Tutorial/HomePage)du site Web, section "4 Communications" tu trouveras plusieurs exemples d'utilisation de la lib Serial.
Notamment tu peux utiliser Serial.available() (http://arduino.cc/en/Serial/Available) dans ta loop() pour tester si tu as reçu quelque chose et Serial.read() (http://arduino.cc/en/Serial/Read) pour lire les caractères reçus.
L'envoi se fait avec Serial.print() (http://arduino.cc/en/Serial/Print) pour de l'ASCII ou Serial.write() (http://arduino.cc/en/Serial/Write) pour du binaire.

A+
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 12:08 pm
Non, non et non, triple non !
Les cartes ne sont pas reliées à aucun PC !
Title: Re: Arduino <== RS232 ==> Arduino
Post by: B@tto on Apr 03, 2012, 01:10 pm
Je vois pas où est le soucis :o

Mega (je passe les fioritures habituelles du code) :

Code: [Select]

if (digitalRead(Bouton)==HIGH) Serial.print ("ON");
else Serial.print ("OFF");


Uno :

Code: [Select]

char Buffer[10];
if (Serial.available){
delay(20);
for (int i=0;i<=9;i++) Buffer[i]='\0';
int x=0;
while(Serial.available) {
Buffer[x]=Serail.read();
x++;
}
if (Buffer=="ON") digitalWrite(13,HIGH);
if (Buffer=="OFF") digitalWrite(13,LOW);


Title: Re: Arduino <== RS232 ==> Arduino
Post by: skywodd on Apr 03, 2012, 01:14 pm
Salut,


Non, non et non, triple non !
Les cartes ne sont pas reliées à aucun PC !

Ok ok ...
Pas la peine de s'énerver, tu parle de communication RS232, soit mais il faut se rapeler que c'est surtout une norme utilisé sur les ordinateurs.

Dans ton cas vu le câblage que tu décrit tu fait une "bête" communication série TTL et non une communication RS232.
Du coté maitre tu doit utiliser Serial.write() et/ou Serial.print() et coté esclave Serial.available() et Serial.read(), regarde dans les exemples du playground tu as différent exemples de communication inter-arduino.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 01:27 pm
Je ne m'everve pas !
Je rectifiais le tir de façon clair.

Maintenant, la ou je vais faire des test c'est du bête TTL. En revanche dans le montage final, je vais utiliser des max232. Le but est de palier à la perte pour un fil long d'une dizaine de mètres. Donc j'ai peut être comis une erreur d'abus de langage.

Ce ci dit avant d'en arrive à mettre des Max ou bien de foncé tête baisser je m'informe.

Je comprend le code simplisme qui m'est donner au dessus. Pourquoi j'ai pas su trouver autre chose que des liaisons Pc/arduino ? Peut être que c'est trop exotique.

Maintenant si je comprend bien, le série TTL on envoie en clair des chiffres et lettres.
Donc il faut que je m'oriente en deux mots. [organe à piloter] [valeur à appliquer]. Genre ,
Serial.print("M1"); // sélectionner le moteur 1
Serial.print("1"); // sortir une PWM de 1ms

Title: Re: Arduino <== RS232 ==> Arduino
Post by: Gaxil on Apr 03, 2012, 03:04 pm
Tu peux définir ton propre protocole, et ce que tu proposes est sans doute suffisant. Comme il n'y a que toi qui l'utilise, tu fais ce que tu veux. Il est cependant plus simple de faire un protocole à taille fixe, ça limite les problèmes. Donc par ex si tu peux envoyer un paramètre variant de 1ms à 200ms comme paramètres, envoie 001->200 ... toujours 3 chiffres. Sans quoi tu ne sauras pas si ton message est complet ou pas.

Maintenant, si tu as un risque de problèmes de communication intempestifs, tu peux ajouter un minimum de sécurité à tes messages par exemple en les encapsulant dans des [] ou autres caractères. Ou encore ajouter un checksum à ton message pour être sur d'avoir eu tout. Avec cela tu sauras si le message est valide et donc si tu peux l'exécuter. J'ai déjà utilisé ça pour des communications sans fils.

Pour la communication entre arduino si le débit n'est pas critique, il est aussi possible d'utiliser de l'I2C avec des résistances pullup adaptées et une vitesse plus lente (http://www.instructables.com/id/I2C-between-Arduinos/). Il y a aussi des répéteurs i2C pour les (très) longues distances ... et tu peux mettre autant d'arduinos que tu veux  sur le bus.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: B@tto on Apr 03, 2012, 03:19 pm
A note qu'en i2c il y a un maitre et plusieurs esclaves, alors qu'en serie on peut en mettre autant qu'on veut et il n'y a ni maitre ni esclave.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 04:54 pm
Au départ, je voulais faire du full I2C.

Il s'avait ait que pour piloter un roc aquatique, cela se serait avéré trop lent.

Au niveau de la carte mega, je gère le poste de pilotage et ses boutons. Dans ce cadre j'ai normalement asser d'entrée sans i2c. En revanche je me laisse la possibilité de mettre des accessoires externe sur l'i2c.

À partir de la, part un fil série, hors i2c, qui va sur une uno qui elle est embarqué.

D'une manière générale, l'union donne priorité au pilotage donne par la mega. Mais retourne des valeurs tel que voie d'eau, luminosité, température, pression.

Si aucune commande n'est exécuté ou si la consigne à la pression à été donné, la uno gère un petit auto pilotage du ballast afin de maintenir la profondeur.

Je rajoute qu'en plus de tout ça, il y a une camarade et un bras manipulateur.

Donc mega ---> i2c ----> écran LCD
Mega ---> tx ---- > rx ----> uno (ordre de pilotage)
Uno ---> tx ---> rx ---> mega (renvoie des paramètres)

Uno -> servo (M1)
Uno -> servo (M²)
Uno -> servo 1, 2, 3 (bras manipulateur)
Uno -> servo (pompe ballast)
Uno <- capteur pression (analogique)
Uno <- capteur 1 ballast
Uno <- capteur 2 ballast
Uno <- capteur température (analogique)
Uno <- capteur lumière (analogique)

En gros, ça c'est ce que je veux faire dans la pratique.

Ok pour encapsuler. Je tente une connexion en directe tx RX et rx TX. Et je voir comment je peux gérer tout ça dans les deux cartes ;)
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 08:10 pm
Bon alors, pour les essais, la méga j'ai pu compiler sans problème ce code
Code: [Select]

//Carte Mega télécommande

#include <Wire.h>

#define addresseLCD 0x63

void setup() {
 
  Serial.begin(9600); //Lancer le mode série
 
  Wire.begin(); //Lancer I2C
 
  Wire.beginTransmission(addresseLCD); //Aller sur l'adresse
  Wire.write((byte)0x00);              //Null
  Wire.write((byte)0x0C);              //Effacer Ecran
  Wire.write((byte)0x04);              //Retirer le curseur
  Wire.write((byte)0x13);              //Allumage de l'ecran
  Wire.endTransmission();              //Fin de transmission
 
  Wire.beginTransmission(addresseLCD); //Aller sur l'adresse
  Wire.write((byte)0x00);              //Null
  Wire.write((byte)0x01);            //Mettre le curseur au début
  //Wire.write((byte)0x02);              //Préparer le curseur à aller ailleur
  //Wire.write(3);                       //Aller sur la case N° 26
  Wire.write("Telecommande");          //Ecrire
  Wire.endTransmission();              //Fin de transmission
}

void loop() {
 
  Serial.print("[ON]");
  delay(2000);
  Serial.print("[OFF]");
  delay(2000);
}


Par contre je n'arrive pas à compiler ceci:
Code: [Select]

//Carte Uno sous-marin

void setup() {
 
  Serial.begin(9600); //Lancer le mode série
 
  pinMode(13, OUTPUT);
 
 
 
  delay(50);
}

void loop() {
 
  char Buffer[10];
 
  if(Serial.available){
   
    delay(20);
   
    for(int i=1; i<=9; i++){
      Buffer[i]='\0';
    }
   
    int x=0;
    while(Serial.available) {
     
      Buffer[x]=Serial.read();
      x++;
    } 
  }
 
  if(Buffer=="[ON]") {
    digitalWrite(13, HIGH);
  }
 
  if(Buffer=="[OFF]") {
    digitalWrite(13, LOW);
  }
}


Et j'obtient cela :
Quote

Mini02___Sous_marin.cpp: In function 'void loop()':
Mini02___Sous_marin.cpp:21: erreur: could not convert 'Serial.HardwareSerial::available' to 'bool'
Mini02___Sous_marin.cpp:30: erreur: could not convert 'Serial.HardwareSerial::available' to 'bool'


Et galère  :smiley-roll-sweat:
Title: Re: Arduino <== RS232 ==> Arduino
Post by: osaka on Apr 03, 2012, 08:19 pm
Yop yop,

available n'est pas un attribut mais une méthode, il manque les "()".

Code: [Select]


if(Serial.available())
.
while(Serial.available())



Pourquoi pas le rs-485, facile à mettre en œuvre pour de grande distance ?
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 08:37 pm
Bon ben ça compile  8)

Mais j'ai pas l'impression que mes trames sortes. Alors que je voir bien les messages de ma mega dans le Serial Monitor...

Je regarde à l'oscillo si ça trame, sinon, il faudra peu-être que je force sur TX0 RX0.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Artouste on Apr 03, 2012, 08:47 pm

Bon ben ça compile  8)

Mais j'ai pas l'impression que mes trames sortes. Alors que je voir bien les messages de ma mega dans le Serial Monitor...

Je regarde à l'oscillo si ça trame, sinon, il faudra peu-être que je force sur TX0 RX0.

bonsoir
à tout hasard
rx--->tx
tx--->rx
ok
mais la reference commune des niveaux existe bien ?
les GND des differentes cartes sont bien reliés ?
Title: Re: Arduino <== RS232 ==> Arduino
Post by: fdufnews on Apr 03, 2012, 09:13 pm
Quote
Je regarde à l'oscillo si ça trame, sinon, il faudra peu-être que je force sur TX0 RX0.

Pas super clair :~


La boucle de réception est mal ficelée.
Le remplissage du buffer ne devrait commencer qu'après s'être assuré que le premier caractère était bien celui attendu [ sinon le buffer peut être rempli n'importe comment et jamais tu ne trouveras ton message.
De même l'interprétation ne devrait commencer qu'une fois le terminateur reçu ] ou éventuellement sur hors temps pour sécuriser la liaison.

Edit: je corrige, le terminateur n'est d'ailleurs pas ] mais \n puisque tu envoie une chaine de caractère.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 03, 2012, 10:35 pm
Alors, l'oscillo ma permis de voir que mon Tx émettais bien des trammes. C'était avant tout pour éviter de dire, je donne un mot à titi, mais c'est tata qui envoie. Là, maintenant, je sait que quelque-chose passe par TX de la Mega.

Maintenant, oui, je suppose que la partie réception n'est pas correcte. Et je n'ai pas vraiment d'autres éléments. Donc là, sur ce point précis, je veux bien un coup de main.

Si quelqu'un à une idée pour détecter le premier "[", ce qui est dedans et enfin le "]". Comme j'ai dit, ce sera simple, [M1][F1] pour moteur 1 et fréquence 1ms, ou bien [M1][F1.5] pour 1,5ms sur M1... Ensuite je pense qu'on peut faire mieux  non ?

Une idée qui m'étais venu etait ceci "<Moteur:1/Frequence:1.5/Option:xxx>" et au retour "<Temperature:1/DegC:120>". Je trouve que c'est beaucoup plus clair comme message et surtout tout est encapsulé entre "<" et ">". Comme en html quoi ;)

Bon, des tests un peu plus poussé me disent que le buffer contient bien tantôt [ON] tantôt [OFF] ! Mais les if(Buffer="[ON]") et if(Buffer="[OFF]") ne fonctionne pas  :smiley-roll-sweat:

Donc il faut chercher là  :smiley-mr-green:

Si quelqu'un à une idée pour mes if, je suis preneur bien sûr ;)
Title: Re: Arduino <== RS232 ==> Arduino
Post by: osaka on Apr 04, 2012, 12:04 am
Yop yop,


Si quelqu'un à une idée pour mes if, je suis preneur bien sûr ;)


Code: [Select]
if(Buffer=="[ON]")

valeur decimal du code ascii '[' == 91, ']' == 93
L'échange de trame sous forme de chaine je suis pas un grand fan, c'est lourd pour pas grand chose.
Un exemple simple de trame que je met en pratique http://arduino.cc/forum/index.php/topic,80422.msg616576.html#msg616576

Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 04, 2012, 12:06 am
Oui, c'est ce que j'ai fait  :smiley-fat:
Code: [Select]

if(Buffer=="[ON]") {
      digitalWrite(13, HIGH);
    }
 
    if(Buffer=="[OFF]") {
      digitalWrite(13, LOW);
    }
Title: Re: Arduino <== RS232 ==> Arduino
Post by: osaka on Apr 04, 2012, 12:18 am
Arf ce n'est pas aussi simple de comparé deux chaine ...

Par facilité utilisé la classe String http://arduino.cc/en/Reference/StringObject ou alors http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html

Dans le cas ici soit http://arduino.cc/en/Reference/StringEqualsIgnoreCase , soit http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga60b6f90e97d0574c5f5725d9db15cd9d

Mais bon comme dans mon edit, utilisé les chaines de caractères (traitement lourd, mémoire, ...) pour de simple échange n'est pas ce qui ce fait de mieux quand on est sur µc.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Microbulle on Apr 04, 2012, 12:25 am
Ben, oui, mais alors on est en désaccord avec le précédent code, sauf si après avoir constitué le Buffer, je le traduit en string.

1) créer le buffer en char
2) Buffer(char) to Variable(String)
3) Tester sur Variable(String)

Si c'est bon, comment transcrire du char en string ?
Title: Re: Arduino <== RS232 ==> Arduino
Post by: osaka on Apr 04, 2012, 12:42 am
Tu n'est pas obligé de construire ton buffer en char mais directement un String, enfin je sais plus si la clase string peux prendre un tableau de char en paramètre constructeur.
Normalement ceci devrait marché
Via la classe String
Code: [Select]

   String str = "";
   while(Serial.available())
   {
       str+=(char)Serial.read();
   }
   
   if(str.equals("[ON]") )
   {
   }


sinon via la lib avr

Code: [Select]

 char Buffer[10];

   int x=0;
   while(Serial.available())
    {
     Buffer[x]=(char)Serial.read();
     x++;
   }
   
   if(strncmp(buffer, "[ON]", 4))
   {
   }


Pas vérifier mais ça devrait être quelque chose comme ça.
Attention avec ta boucle while(Serial.available()) rien ne dit que tu recevras bien toute la trame en 1 coup.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 04, 2012, 07:53 am
Plop,

Bon , je viens d'essayer ceci :
Code: [Select]

//Carte Uno sous-marin

void setup() {
 
  Serial.begin(9600); //Lancer le mode série
 
  pinMode(13, OUTPUT);
 
  delay(50);
}

void loop() {
 
  String str = "";
 
  if(Serial.available()){
   
    delay(20);
   
    while(Serial.available()) {
     
      str+=(char)Serial.read();
    }
   
    if(str.equals("[ON]")) {
      digitalWrite(13, HIGH);
    }
 
    if(str.equals("[OFF]")) {
      digitalWrite(13, LOW);
    }
  }
}

Pourquoi je me suis lever les bras en l'air en criant "Ça marche ! Ça marche !"...

Merci pour le coup de pouce :)

A partir de là, je pense faire ceci:
- Si on a bien un signal -> if(Serial.available()){
- Si on a bien reçu le premier caractère "<"
- Boucler tant que l'on a pas reçu le dernier caractère ">"
- Récupérer la chaîne, parser les commandes "organe:numéro/option:valeur" Si pas d'option, se laisser la possibilité de mettre "organe:numero"

D'une manière générale, je vais faire un code tournant, c'est à dire passé commande par commande, plutôt que tout à la fois. Ainsi, j'aurais:
<Mot1:1.5>
<Mot2:1.5>
<Ser1:2>
<Ser2:1>
<Ser3:1.5>
<Pre1:Lock> ou <Pre1:Unlock>
<Lig1:On> ou <Lig1:Off> (pour les lights)

C'est qu'un exemple mais je pense que ça peut se faire, sinon, je part avec des valeurs fixes. Genre on envoie <00000000000000000000> On sait qu'on a une balise entrante, 20 caractères, balise fermante. Si on a une liaison défectueuse, à ce moment là, la uno aquite le défaut et passe en mode sécu. Vidage du ballast, mise en marche des feux d'erreurs.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: barbudor on Apr 04, 2012, 08:00 am
Le code ci-dessus ne permet pas de se synchroniser en cas de perte de synchro.

Si les messages sont assez peu réguliers, le temps entre les messages peut suffir à se recaler.
Mais les messages arrivent à un rythme soutenu il faut d'abord chercher la synchro sur le marqueur de début.
Il est bien d'avoir un charactère de début et un différent pour la fin.
Que ce soit '[' et ']' comme ci-dessus ou par exemple '$' et '\n' dans les trames NMEA.

Comme dans beaucoup de cas, une solution propre et fiable passe par l'implémentation d'un automate simple.

Par exemple (code non testé car je suis en déplacement mais l'esprit y est):

Code: [Select]


// Variables globale
enum E_State { ATTENTE_SYNCHRO, LECTURE_MESSAGE } State = ATTENTE_SYNCHRO;

#define CHAR_DEBUT '['
#define CHAR_FIN ']'

String message;
int messageRecu = false;


// fonction a intégrer dans loop() ou dans serialEvent()
reception_serie()
{
 while ( Serial.available() )
 {
char c = Serial.read();
switch ( State )
{
case ATTENTE_SYNCHRO:
// Caractère de début : on commence a recevoir un nouveau message
message = "";
State = LECTURE_MESSAGE;
break;
case LECTURE_MESSAGE:
switch ( c )
{
case CHAR_DEBUT:
// Si on reçoit le caractère de debut, on repart sur un nouveau message
// Si un message était déjà en court de réception mais que l'on a perdu
// le caractère de fin, alors on poubellise le message incomplet car
// il est probablement inexploitable.
// Une autre politique peut être de considérer qu'un caractère de début
// en plein milieu d'une reception en cours agit à la fois :
// - comme un caratère de fin et lance le process de traitement du message
// - et comme un début de nouveau message
message = "";
State = LECTURE_MESSAGE;
break;
case CHAR_FIN;
// on signale a la boucle de traitement qu'il y a un message a traiter
messageRecu = true;
break;
default:
// tout autre caractère est ajouté au message en court
message += c;
}
}
 }
}

// Fonction de traitement des messages, a intégrer dans loop()
traitement_message()
{
if ( message_reçu )
{
// faire le boulot ici d'analyse du message
// notez que les characteres de début et fin ne sont plus dans le message
}
}


Pour info, l'utilisation de la classe String ci-dessus, bien que simplifiant le code n'est pas une bonne idée dans la pratique car le fait d'ajouter caractère par caractère va faire une utilisation abusive d'allocation/re-allocation dynamique de mémoire.
Il est plus efficace d'utiliser un tableau de char dimensionné suffisamment pour les message le plus grand et de gérer le non débordement de ce message.
Si besoin je peux revenir sur le code ci-dessus avec une telle méthode.

Si le code de réception est dans loop() (et non pas dans serialEvent()) alors il est possible d'appeller la fonction de traitement directement depuis le case CHAR_FIN.
Sinon, et si les messages peuvent arriver rapidemment, il peut etre prudent de gérer une FIFO de messages pour éviter que le message en cours de traitement soit effacé par un nouveau arrivant.
Mais comme l'Arduino n'est pas nativement multitâche ca ne devrait pas se produire.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 04, 2012, 08:18 am
Oui, je suis d'accord avec toi. Mais je voulais d'abord validé le fait que la communication fonctionnais.

Maintenant que je sait comment émettre puis recevoir, il faut que je normalise. C'est vrai que Moteur et Light c'est pas le même nombre de caractère. Envoyer des chiffres, berc, incomprehensible alors que l'on peut se permettre mieux.

J'ai regardé ton code, wah, il est lourd et complet. Je voudrais vraiment simplifier.

Ok pour un tableau de char mais alors, il faut régler le souci des if. A propos, je transmet en clair l'ordre afin de soulager la uno, sauf dans certains cas.
Ok aussi pour gérer la perte de signal ou bien, le fait de recevoir plein de trame et de les traiter.

D'une manière générale, il faut moins de 100 ms entre traitement carte 1, liaison et traitement carte 2, exécution. Donc il faut vraiment que ça punch. Peut-être en passant par des fonctions de traitement. Genre, si je reçois quelque-chose j'appel la fonction de récupération de valeur, je retourne la valeur, je transmet la donnée au bon endroit, je passe à la suivante. Mais si entre temps j'ai reçu d'autres trames, c'est mort. L'autre solution, est de mettre en attente les envoies avec un <ack>. A ce moment la, le maître n'enverra la commande que si l'acquittement de réception à été donné par l'esclave.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 04, 2012, 12:17 pm
@ barbudor : Bon et bien, ton code ne fonctionne pas !!!!  :smiley-sweat:

Je pense que la logique y est mais pas le code  :smiley-mr-green:

Bon, ce que je vais faire, c'est dans le loop()
- Si pas d'opération, attendre un Serial.available()
-- Appeler la fonction réception, recevoir l'ordre 1 sous la forme "<Led1, on>" ou "<Led1, off>" par exemple.
-- Traiter l'opération par une fonction, Lancer un depuis une fonction Acknowledge "<ACK>"
- Boucler
Title: Re: Arduino <== RS232 ==> Arduino
Post by: Geeks on Apr 04, 2012, 02:11 pm
Bon et bien, je suis arrivé à un bout de quelque-chose...
Code: [Select]

//Carte Uno sous-marin

char commande[32];


void setup() {

  Serial.begin(9600); //Lancer le mode série
  pinMode(13, OUTPUT);
}

void loop() {

  if(readCommande() != 0) {
   
    Serial.println(commande);
   
    if(strcmp(commande, "<on>")==0) {
      digitalWrite(13, HIGH);
    }
    if(strcmp(commande, "<off>")==0) {
      digitalWrite(13, LOW);
    }
  }
  delay(20);
}

int readCommande() {
  if(!Serial.available()) {
    return 0;
  }
 
  int i=0;
 
  while(Serial.available()) {
    commande[i]=Serial.read();
    i++;
  }
 
  commande[i] = 0;
  return i;
}



Maintenant, il faut qu'au niveau de mon buffer, on puisse faire ceci:
"<" début de trame
">" fin de trame
"ordre, chiffre ou valeur" entre "<" ">"

Interdire tout autre traitement tant que le traitement en cours n'est pas effectif.
Title: Re: Arduino <== RS232 ==> Arduino
Post by: IliasHi on Apr 18, 2017, 11:01 am
Bonjour a Tous je suis nouveau  , je voudrais avoir un peu d aide pour programmer sur Arduino .J ai un projet qui consiste a espionner des câbles sans modifier les données,pour moi c est la RS232. et j aimerai stocker les données de la liaison série dans un tableau mais je ne sais pas comment m y prendre. Voici ce que j ai fais juste pour lire des données :

#include <SoftwareSerial.h>

#define rxPin 2   // Je definis les broches Rx et Tx
#define txPin 3

SoftwareSerial softSerial =  SoftwareSerial(rxPin, txPin);

void setup()  {

 pinMode(rxPin, INPUT);//Configure les broches pour l entrée et la sortie
 //pinMode(txPin, OUTPUT);
 softSerial.begin(9600);

 Serial.begin(14000);
}

void loop() {

 int data = softSerial.read();
 Serial.println(data); ASCII
}