Ma fonction suivante lit à partir d'un port série, traite les données et affiche les informations à l'utilisateur. la chose intéressante est que cela semble ne fonctionner que lorsqu'il est appelé sur des instances impaires. Sur les lectures paires, le cas de dépassement de délai se produit.La fonction fonctionne à chaque fois qu'elle est appelée
Cette fonction est appelée toutes les 10 secondes ou plus tôt si elle est appelée par l'utilisateur. Peu importe à quelle fréquence ça s'appelle, ça marchera toutes les deux fois.
CODE:
bool SR(bool echo, int&value)
{
bool valid;
byte buf [2];
sur les appels même red
retours 0
byte red = Serial2.readBytes(buf,2);
if(red>0)
{
Voici la "bonne données" cas SvAdd
me donne l'adresse de l'expéditeur en FCode
donne le type de message envoyé (il sont 8 types de messages, mais nous n'utilisons que les types 3 et 6)
valid=true;
byte SvAdd = buf[0];
byte FCode = buf[1];
int Read;
byte registerL;
switch (FCode)
{
case 3:
données pour le cas 3 (lecture seule) apparaît comme indiqué dans ce tableau:
Serial2.readBytes(buf,1);
registerL = buf[0];
for (byte i=(registerL/2); i>0 ; i--)
{
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
}
Pour l'instant, registerL
devrait cependant toujours 2
j'ai ajouté la boucle juste au cas où
value=Read;
break;
case 6:
Les données du cas 6 (écriture puis lecture) apparaissent comme indiqué dans ce tableau:
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
value=Read;
Je sais l'adresse si je lis passé et ne regarde les bits de données afin de vérifier la fonction correcte a été écrit
break;
}
Aquire les deux derniers octets CRC de la fonction (pour effacer la mémoire tampon)
Serial2.readBytes(buf,2);
int CRC = buf[1] | buf[0] << 8;
if (echo)
{
Serial.println(SvAdd);
Serial.println(FCode);
switch (FCode)
{
case 3:
Serial.println(registerL);
Serial.println(Read); //Last Value read
break;
case 6:
Serial.println(Read); //Value
break;
}
Serial.println(CRC);
}
return valid;
}
est ici le cas où red=0
else
{
valid=false;
Serial.println("timeout");
return valid;
}
}
EDIT (code contigu)
bool SR(bool echo, int&value)
{
bool valid;
byte buf [2];
byte red = Serial2.readBytes(buf,2);
if(red>0)
{
valid=true;
byte SvAdd = buf[0];
byte FCode = buf[1];
int Read;
byte registerL;
switch (FCode)
{
case 3:
Serial2.readBytes(buf,1);
registerL = buf[0];
for (byte i=(registerL/2); i>0 ; i--)
{
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
}
value=Read;
break;
case 6:
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
Serial2.readBytes(buf,2);
Read = buf[1] | buf[0] << 8;
value=Read;
break;
}
Serial2.readBytes(buf,2);
int CRC = buf[1] | buf[0] << 8;
if (echo)
{
Serial.println(SvAdd);
Serial.println(FCode);
switch (FCode)
{
case 3:
Serial.println(registerL);
Serial.println(Read); //Last Value read
break;
case 6:
Serial.println(Read); //Value
break;
}
Serial.println(CRC);
}
return valid;
}
else
{
valid=false;
Serial.println("timeout");
return valid;
}
}
Il serait beaucoup plus facile d'examiner votre code s'il était posté comme un seul bloc contigu, au lieu de morceaux. – TomServo
Désolé, éditer maintenant –
@TomServo Bloc contigu créé et ajouté à la fin –