Bonjour, je deterre ce topic pour comprendre comment fonctionne memcpy(....)
De la meme façon que bigfoot69100 je doit manipuler des messages sur la liaison serie en binaire (representé en hexa). un maitre (Modem) questionne un esclave (Device). Plusieurs esclaves lisent ce qui se passe sur le "reseau":
Je reçoit en provenance du "maitre" F2 40 05 65 FD 08 08 F6
F2: debut 4005: id du device (esclave) 65: question du ..... FD 08 08 F6: id du modem(maitre)
Note: le message (question) posée par le Modem est toujours de 8 Octets et je transmet la reponse du "Device" 19 octets :
F2 40 05 75 FD 08 19 00 57 01 0A 00 17 01 AE FD 08 08 F6
id device 75: reponse du device data id du modem
Pour commencer j'aimerais extraire les differents "mots" pour les traiter par la suite (id device, id modem ...) car je peux avoir plusieurs Devices pour 1 modem.
le probleme est que je n'arrive pas a extraire les bonnes valeurs et j'obtiens ça :
Code d'entree: F2 hex
Octet N°0 ⸮ en Hex:FFFFFFFF
Octet N°1 @ en Hex:40
Octet N°2 ⸮ en Hex:FFFFFFFF
Octet N°3 en Hex:5
Octet N°4 ⸮ en Hex:FFFFFFFF
Octet N°5 e en Hex:65
Octet N°6 ⸮ en Hex:FFFFFFFD
TAG code is: ⸮@⸮⸮e⸮
idDevice: 0
Q/R: 0
idModem: FF
Voici le sketch :
//======== LED integree =========
#define ledInt 17 //LED integre sur 17
#define DEBUG 1//1 pour afficher le debug
int val = 0;
char code[11];
int bytesread = 0;
long decval = 0;
//===================================
//= SETUP =
//===================================
// the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
delay(3000); //delai pour ouvrir COM8 apres televersement
//========== LED =========
pinMode(ledInt, OUTPUT);
digitalWrite(ledInt, HIGH);// Éteindre la LED
Serial.println(F("+++ RxCodeHexa To Decimal pr1a +++"));
} // FIN de setup
//===================================
//= LOOP =
//===================================
void loop() {//Rx: ⸮@e⸮⸮ F2 40 05 65 FD 08 08 F6
if ((val = Serial1.read()) == 0xF2)
{ // check for header
Serial.print("Code d'entree: "); Serial.print(val, HEX); Serial.println(" hex"); //DEBUG DEC:242 HEX:F2
bytesread = 0;
while (bytesread < 7) // je regarde les 7 octtes APRES le F2
{ // read 10 digit code
val = Serial1.read();
if ((val == 10) || (val == 13))
{ // if header or stop bytes before the 10 digit reading
break; // stop reading
}
code[bytesread] = val; // add the digit
if (DEBUG) {
Serial.print("Octet N°");
Serial.print(bytesread); Serial.print(" ");
Serial.print(code[bytesread]); Serial.print(" en Hex:"); Serial.println(code[bytesread], HEX); //DEBUG DEC:242 HEX:F2
}//FIN du debug
bytesread++; // ready to read next digit
}
code[10] = 0; // NULL terminate
if (bytesread == 7)// j'ai m'es 7 octets APRES le F2
{ // if 10 digit read is complete
Serial.print("TAG code is: "); // possibly a good TAG:40 05 65 FD 08 08 F6
Serial.println(code); // print the TAG code
byte idDeviceChar[5];
byte codeQuestionReponseChar[2];
byte idModemChar[5];
Serial.print("idDevice: ");
memcpy(idDeviceChar, code + 0 , 2); //2=44;3=65;1=0
Serial.println(idDeviceChar[5], HEX);
Serial.print("Q/R: ");
memcpy(codeQuestionReponseChar, code + 2, 1);//+1,2=65
Serial.println(codeQuestionReponseChar[3], HEX);
Serial.print("idModem: ");
memcpy(idModemChar, code + 3 , 4); //2=44;3=65;1=0
Serial.println(idModemChar[5], HEX);
}
bytesread = 0;
//delay(500); // wait for a second
Serial.print("\n"); // retour à la ligne
}
} //FIN de loop
Le but est de distinguer les diférents mots qui compose cette phrase et agir en conséquence.
Avez vous une idée du pb dans la partie memcpy ?
Merci