Pages: [1]   Go Down
Author Topic: Décalage entrée sortie  (Read 513 times)
0 Members and 1 Guest are viewing this topic.
France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)

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

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 61
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Bonjour,

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 :
Code:
cmdByte = 1
mais
Code:
cmdByte == 1
(double égale = condition, simple égal = assignation (toujours vrai))
Logged

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

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

D'ailleurs pour éviter cette erreur, on peut utiliser un "if inversé" :
Code:
if (1 == cmdByte)
Ainsi si par erreur on ne met qu'un seul = le compilateur signale une erreur et pas un simple warning.
Logged


France
Offline Offline
Jr. Member
**
Karma: 0
Posts: 50
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Autant dire que je suis vraiment rouillé si je fais des erreurs comme ça ...  smiley-mr-green
Enfin ...
Merci beaucoup !
Logged

Pages: [1]   Go Up
Jump to: