Décalage entrée sortie

Salut !

Un petit truc que je ne comprends pas ... par l'interface série j'envoie à mon arduino une valeur numérique et lui demande de me renvoyer cette valeur, mais je reçois toujours ma valeur + 4813 ...

Pourquoi ce décalage ?

Voici mon code (partiel car seul cette partie me pose problème)

int req = 13; //mic REQ line goes to pin 5 through q1 (arduino high pulls request line low)
int dat = 12; //mic Data line goes to pin 2
int clk = 11; //mic Clock line goes to pin 3
volatile int i = 0; int j = 0; int k = 0;

float mm;

int cmdByte;
byte mydata[14];

void setup()
{
  Serial.begin(19200);
  pinMode(req, OUTPUT);
  pinMode(clk, INPUT);
  pinMode(dat, INPUT);
  digitalWrite(clk, HIGH); // enable internal pull ups
  digitalWrite(dat, HIGH); // enable internal pull ups
  digitalWrite(req, LOW); // set request at high
//  attachInterrupt(0, pulse, RISING);
}

void loop()
{
  
}

//void pulse()
...

...

void serialEvent()
{
  cmdByte = Serial.read();
  Serial.print(cmdByte);
}

Salut,

Le moniteur série de l'environnement Arduino envoie des caractères. Si tu envoies 0, l'Arduino va en réalité recevoir le caractère '0' (=48) puis un retour chariot '\r' (=13).

Il y a deux moyens de pallier au problème :

  • se passer du moniteur série de l'environnement Arduino et envoyer la valeur (et non le caractère) ;
  • ou soustraire 48 à la valeur reçue sur ta carte Arduino.

++

PS: voici une table ASCII pour visualiser :

Bonjour,

tu peux utiliser la fonction atoi qui converti des char en int. Cf l'exemple "Servo-moteur et serial monitor" sur https://sites.google.com/site/esatranslab/ressources/arduino-1/arduino-tuto

Serge

Ok merci !

je n'avais effectivement pas pensé que le moniteur série envoyait des caractères (ce qui pourtant est logique) et quand je passe par mon programme VB.NET pour envoyer et recevoir les données tout ce passe bien car j'envoie et reçois des int.

Autre problème ... j'ai modifié ma fonction SerialEvent, et la méthode detachInterrupt ne fonctionne pas ... ce que je ne comprends pas car la méthode attachInterrupt marche et est appelée dans les mêmes conditions ...

void serialEvent()
{
  cmdByte = Serial.read(); // receive command from USB interface
  
  if (cmdByte=1){
    attachInterrupt(0, pulse, RISING); // enable requests to digital indicator triggered by the encoder
  }else{
    detachInterrupt(0); // disable requests to digital indicator
  }
}

(je lancerai un nouveau topic si nécessaire)

Euh correction, ... ce ne sont pas les méthodes qui sont en cause mais bien la condtion ... j'ai l'impression que attachInterrupt est appelée quelque soit le cmdByte reçu ...

Bonjour,

Ervann:
Euh correction, ... ce ne sont pas les méthodes qui sont en cause mais bien la condtion ... j'ai l'impression que attachInterrupt est appelée quelque soit le cmdByte reçu ...

Erreur bête, ce n'est pas :

cmdByte = 1

mais

cmdByte == 1

(double égale = condition, simple égal = assignation (toujours vrai))

D'ailleurs pour éviter cette erreur, on peut utiliser un "if inversé" :

if (1 == cmdByte)

Ainsi si par erreur on ne met qu'un seul = le compilateur signale une erreur et pas un simple warning.

Autant dire que je suis vraiment rouillé si je fais des erreurs comme ça ... :grin:
Enfin ...
Merci beaucoup !