Go Down

Topic: Tableau byte + choix de données ? (Read 669 times) previous topic - next topic

200sx200

Bonjour tous le monde,

Je crée ce poste car je ne trouve pas de solution à mon problème.

Je reçois des données par le Serial2 et enregistre les valeurs dans un tableau byte.

Mon soucis et que s'il y à des "données fantômes ou parasites) j'obtiens des calculs erronés. Par chance les seul valeurs que je ne souhaite pas intégrer à mon tableau sont des "0".

Exemple de données reçues:
Code: [Select]

12
4C
0
0
0
C0
0
5E
64
0
0
FF
0
5E
FF
0
0
12
0
5E
FF
0
0
FF
12
0
4C
5B
0
0
FF
0
5E
FF
0
0
12
0
0
FF
0
C0
0
4C
5B
0
0
C0
0
4C
5B
0
0

FF // ici début de transmission
12 // ici nombre de byte transmisse
5E
64
4C
5B
10
C0
9B //ici la valeur est = à 12.3Volt
5B
10
FF
5E
64
12
FF
C0
FF
12
9B //ici la valeur est = à 12.3Volt
----
5B
10
0




et mon programme Arduino:

Code: [Select]


byte consult[12];

int batt;
int tps;



void setup() {
  Serial.begin(9600);
  Serial2.begin(9600);
}

void loop() {
 

  Serial2.readBytes(consult, 12);


  if (consult[0] == 0xFF) {
   
    //Battery Volt
    batt = (consult[6] * 80) / 1000.0;

    //Throttle Position voltage
    tps = consult[9];
    tps = ((tps * 20) / 1000.0);


    Serial.print("Battery="); Serial.println(batt);
    Serial.print("Throttle="); Serial.println(tps);

  }

}//End Loop


Le programme fonctionne correctement sauf que de temps en temps les valeurs change et finissent par faire la boucle car les "0" prennent la place d'une valeur correct.

Ma question est donc comment enregistrer mes valeurs correctement dans le tableau sans prendre en compte les "0" ?

Merci d'avance..

fdufnews

Un petit coup d'oeil par là peut-être.
La méthode readBytes() retourne le nombre de caractères reçus. Il faudrait penser à le vérifier car si la fonction retourne sur timeout alors le buffer n'est pas rempli avec le nombre de caractères attendus.

200sx200

Un petit coup d'oeil par là peut-être.
La méthode readBytes() retourne le nombre de caractères reçus. Il faudrait penser à le vérifier car si la fonction retourne sur timeout alors le buffer n'est pas rempli avec le nombre de caractères attendus.
Merci,
Je ne suis que depuis peu, sur la programmation, ce que je dois comprendre c'est que les "0" que je reçois sont des données non validés par le readbytes ?

Le vérifier par un Serial.available ?

J-M-L

#3
Sep 10, 2017, 08:06 pm Last Edit: Sep 10, 2017, 08:08 pm by J-M-L
ce que je dois comprendre c'est que les "0" que je reçois sont des données non validés par le readbytes ?
non ce sont des données qui trainent dans votre tableau consult mais qui n'ont peut-être pas été reçues. si readBytes() vous dit qu'il a lu 7 octets, alors il ne faut conserver que consult[0] à  consult[6]


vous ne devriez pas utiliser readBytes(), vous devriez coder vous même la réception des données sur le port Série. Si vous lisez l'anglais, jetez un oeil sur ce tuto Serial Input Basics

Hello - Please do not PM me for help,  others will benefit as well if you post your question publicly on the forums.
Bonjour Pas de messages privés SVP, postez dans le forum directement pour que ça profite à tous

200sx200

non ce sont des données qui trainent dans votre tableau consult mais qui n'ont peut-être pas été reçues. si readBytes() vous dit qu'il a lu 7 octets, alors il ne faut conserver que consult[0] à  consult[6]
D'accord, par contre je sais comment qu'il a lu 1 ou plusieurs octets ?

Si je reçois par exemple moins des 12 octets, il faut quand même qu'il est leur place respective consult[X] pour le calcul de telle valeurs final.

fdufnews

#5
Sep 10, 2017, 08:30 pm Last Edit: Sep 10, 2017, 08:30 pm by fdufnews
Dans ma réponse précédente j'ai indiqué "La méthode readBytes() retourne le nombre de caractères reçus."
Il suffit de faire ça:
Code: [Select]
byte carRecu = Serial2.readBytes(consult, 12);
et carRecu contiendra le nombre de caractères reçus par la fonction.

200sx200

byte carRecu = Serial2.readBytes(consult, 12);
Je sais pas pourquoi, je n'ai est pas pensé, merci.

Quelle serait la meilleure façon pour suivre ce protocole ?
Code: [Select]

Read any ROM BYTE (Internal ROM, program code) (0xc9)
(0xc9)<High byte><low byte>(0xf0)for single byte
(0xc9)<High byte><low byte>(0xc9)<high byte><low byte>(0xf0)
for amulti-byte response. Maximum of 8 bytes.
terminate command with (0xf0) to start data stream, stop with (0x30).
ROM space starts at 8000h and ends at  ffffh. RAM addresses can be read by this
method also.
For example, to read 3 bytes at addresses 0x8000...0x8002, send:
c9 80 00 c9 80 01 c9 80 02 f0
ECU  response:
36 80 00 36 80 01 36 80 02 FF 03 05 03 08
36 is inverted C9 etc, FF 03 is a header and the record's length, then the three
data bytes.
All the ECU eprom data can be read out by reading 8 bytes at at time and
appending to a file. This is used to create ROM binaries for use in expansion boards.

200sx200

"byte carRecu = Serial2.readBytes(consult, 12);"

En faite le carRecu ne me donne que la valeur du tableau "12" si je change le consult[X] carRecu = X, donc ne marche pas :/

Go Up