Go Down

Topic: Récupérer un code de liaison série dans un char (Read 658 times) previous topic - next topic

SimonGEII

Bonjour à tous,

Je travaille sur un projet dans lequel je dois afficher une consommation énergétique.
Je reçois cette consommation grâce à une liaison série entre une carte Arduino UNO et une carte Arduino YUN.

Sauf que mon problème est pour intégrer ce que je reçois en liaison série dans une chaine de caractère.

Pour l'instant, j'ai ce code mais ça ne donne rien :

 char *s;
 while(mySerial.available())
  {
    Serial.print((char)mySerial.read());
    *s=(char)Serial.read();
  }

Sachant que la première ligne du while marche bien, j'arrive à recopier ce que je reçois mais je n'arrive pas à l'intégrer dans un char.

Merci pour votre aide.

kamill

Bonjour,

Un char c'est un caractère unique. Ce que tu reçois c'est une chaîne de caractères c'est à dire une suite de caractères.

Le plus simple pour recevoir une chaine de caractères c'est d'utiliser readBytes()
Code: [Select]
  char s[20]; // à dimensionner en fonction de la chaine espérée
  if (mySerial.available())
  {
    int n = mySerial.readBytes(s, sizeof s - 1);
    s[n] = 0;       // marque la fin de la chaine
    Serial.println(s);
  }

pascalbondu

#2
May 24, 2019, 05:40 pm Last Edit: May 24, 2019, 05:44 pm by pascalbondu
Bonjour,

Je pense que cela pourra vous mettre sur la voie.
https://forum.arduino.cc/index.php?topic=616587.0
Attention à la charte!!
https://forum.arduino.cc/index.php?topic=394754.0



biggil

dans ton code, tu declares un pointeur char* s;
Puis, tu lis un caractère et tu le stockes à l'adresse définie par ce pointeur *s=(char)Serial.read();

Sauf que ... tu n'as jamais défini quelle adresse est pointée par le pointeur.
Donc ton caractère est stocké ... n'importe où. Il y a des chances que ce soit à l'adresse 0, mais par sûr.
Donc, fais simple :
Code: [Select]
char c;
.../...
c =(char)Serial.read();
Aide toi, le compilateur t'aidera

SimonGEII

Bonjour, merci pour vos réponses.

J'avais essayé en déclarant un char c puis en faisant c = (char)mySerial.read();
Sauf qu'il me renvoi cette erreur que je ne comprends pas :

c:\users\geii\desktop\arduino-1.8.9\hardware\tools\avr\avr\include\string.h:576:14: note:   initializing argument 1 of 'char* strtok(char*, const char*)'

 extern char *strtok(char *, const char *);

supercc

Bonsoir,

tu utilises strtok dans ton programme ? Tu peux poster tout ton programme ?

fdufnews


iFrostizz67

Je suis quasiment dans le même cas que toi !

Je suis parti d'un code trouvé sur internet, à toi de te débrouiller. Voici le lien: https://iotguider.in/arduino/serial-communication-between-two-arduino-boards/

Transmeteur:

Code: [Select]
char mystr[5] = "Hello"; //String data

void setup() {
  // Begin the Serial at 9600 Baud
  Serial.begin(9600);
}

void loop() {
  Serial.write(mystr,5); //Write the serial data
  delay(1000);
}


Récepteur:

Code: [Select]

char mystr[10]; //Initialized variable to store recieved data

void setup() {
  // Begin the Serial at 9600 Baud
  Serial.begin(9600);
}

void loop() {
  Serial.readBytes(mystr,5); //Read the serial data and store in var
  Serial.println(mystr); //Print data on Serial Monitor
  delay(1000);
}


Maintenant, mon problème est que je n'arrive pas à envoyer et recevoir une variable (Un analogRead par exemple) .... Donc si jamais tu as une piste, ou quelqu'un d'autre :D

dbrion06

Avez vous pensé, si vous souhaitez décoder proprement (i.e sans perte de caractères; sans horreurs qui sont presque aussi nombreuses que les lois de Murphy) à regarder:
https://forum.arduino.cc/index.php?topic=500683.0

SimonGEII

Merci beaucoup à tous, j'ai pu réussir mon programme et j'arrive maintenant à récupérer ce que je reçois.

Voici mon code pour ceux qui reste intéressés :

Code: [Select]


int EHP;
int EHC;
int n;

SoftwareSerial mySerial(3, 4); // RX, TX


void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  Serial.println("TESTS");
  tft.begin();
}


void loop()
{
  char s[11]; // à dimensionner en fonction de la chaine espérée
  s[n]=0;
  float prixHC=0.0001230;
  float prixHP=0.0001580;
  char AffPrixHP[6];
  char AffPrixHC[6];
  if (mySerial.available())
  {
    n = mySerial.readBytes(s, sizeof s - 1);
    s[n] = 0;       // marque la fin de la chaine
  }
  char *a, *b, *c;

  Serial.println(s);
 
  b = strtok(s, "P");
 
  c = strtok(0, "\0");
 
  //Serial.print("ConsoHP=");
  Serial.println(b);
 
  //Serial.print("ConsoHC=");
  Serial.println(c);
 
  sscanf(b, "%d", &EHP);
  sscanf(c, "%d", &EHC);
 
  float prixConsoHP=(EHP*prixHP);
  float prixConsoHC=(EHC*prixHC);
 
  tft.setCursor(5,85);
  tft.println(b);
 
  tft.setCursor(32,85);
  tft.println("Wh en heures pleines");
 
  tft.setCursor(5,105);
  tft.println(c);
 
  tft.setCursor(32,105);
  tft.println("Wh en heures creuses");
 
  tft.setCursor(165,85);
  tft.println(prixConsoHP);
 
  tft.setCursor(200,85);
  tft.println("euros");
 
  tft.setCursor(165,105);
  tft.println(prixConsoHC);
 
  tft.setCursor(200,105);
  tft.println("euros");
 
}


Go Up