Serial read et write HEX

Bonjour à tous,

d'habitude je n’embête pas les forums avec mes question mais la je m'arrache les cheveux.

Je tente de lire de Hexa pas de problème pour sa, mais je dois surtout formater les donnée reçu sous un format spécial.
par ex : j'envoi BB 00 27 00 03 22 FF FF 4A 7E au lecteur RFID et je reçois en hexa BB 01 FF 00 01 15 16 7E en boucle jusque le lecteur détecte une puce RFID mais je cherche à compter combien de fois je reçois cette donnée en comptant le nombre de fois que 7E et read par l'arduino en hexa.

Javais penser à un .find mais je ne sais pas comment rechercher de l'hexa.

Quelqu'un aurait une idée ?

Merci d'avance.

Bonjour,

Qu'est ce que tu appelles de l'hexa?
Une chaine de caractères en format ascii hexa ou un tableau d'octets (binaire) que tu représentes en hexa ?

Merci de ta reponse

Se genre d'hexa.

byte multi_read[] = {0xBB, 0x00, 0x27, 0x00, 0x03, 0x22, 0xFF, 0xFF, 0x4A, 0x7E};
Serial.write(multi_read, sizeof(multi_read));

Et après sa je n'ai pas trouver le moyen de lire la réponse et surtout de .find dans la réponse.

Donc ça c'est du binaire.
C'est un tableau d'octets qui est initialisé avec une représentation hexa, mais qui pourrait tout aussi bien être initialisé en décimal

Pour rechercher dans un tableau d'octets tu as la fonction memchr() qui recherche un octet, mais si tu veux vraiment compter le nombre de fois ou un certain caractère apparaît, il faut le faire avec une boucle de programme

Par exemple pour rechercher dans multi_read

  int nbVal=0;

  for (int i=0; i<sizeof multi_read; i++)
    if (multi_read[i]==0x7E)
      nbVal++;

Merci a toi,
et je cherche aussi a isoler dans la réception du code une partie predefinie par exemple je recois depuis le lecteur rfid BB 01 39 00 13 0E 34 00 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 12 34 56 78 B0 7E
mais je cherche a isoler la partie 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 et de la renvoyer dans un autre serial a tu une idée.

Est ce que ta partie prédéfinie est toujours au même endroit et de même longeur.
Si c'est le cas, il suffit d'envoyer une partie ou de copier une partie dans un buffer

Par exemple si ton buffer de réception est bufRec et que tu veux copier la partie qui t'interresse dans buf

 byte buf[12];

  memcpy(buf,bufRec+8,12);

Ok merci pour tout par contre comment je fais pour utiliser bufRec ?

Car j'envoi "Serial.write(multi_read, sizeof(multi_read));" au lecteur rfid
après je reçois en boucle en provenance du lecteur rfid "byte ans[]= {0xBB,0x01,0xFF,0x00,0x01,0x15,0x16,0x7E};" comme quoi le le lecteur ne trouve pas de rfid
et ensuite une fois qu'il a trouver un rfid il m'envoi se genre de code BB 01 39 00 13 0E 34 00 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 12 34 56 78 B0 7E et je renvoi la partie 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 dans un autre serial.

Mais j'ai plusieurs question.

Pour la lecture des donnée reçu par le lecteur RFID je doit faire un .read ou quelque chose de plus complexe ?

SI j'ai bien compris

int nbVal=0;

for (int i=0; i<sizeof multi_read; i++)
if (multi_read*==0x7E)*

  • nbVal++;*
    va me servir a lire les données reçu par le lecteur RFID et a savoir combien de fois j'ai reçu 0x7E de la part du lecteur rfid ?
    Et dernière question pour memcpy je doit faire un Serial.read et copier se que je reçois ?
    Merci encore pour tes réponses

Tu dois bien lire ce que t'envoie ton lecteur quelque part ? Autrement comment tu sais ce qu'il t'envoie
C'est ce message qu'il faut analyser (bufRec c'était juste un exemple).

Oui je le lis sur ma broche Rx

Et après qu'est ce que tu fais de ce que tu as lu?

je fais un

Serial.print(Serial.read());

et je reçois BB 01 FF 00 01 15 16 7E comme quoi le lecteur rfid cherche des tags RFID.

mais quand le lecteur en trouve un rfid BB 01 39 00 13 0E 34 00 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 12 34 56 78 B0 7E et donc la je dois isoler le numero rfid 30 75 1F EB 70 5C 59 04 E3 D5 0D 70 mais je sais pas comment faire :-/

Il faut que tu teste si tu reçois BB.
A ce moment tu commences l'analyse
si le 7 octets suivants sont 01 39 00 13 0E 34 00 tu mémorise ensuite les 12 octets suivants.

Tu as un exemple ici. Apparement ce n'est pas le même protocole, mais c'est le même principe.

Oui super sa a l'air d’être sa,

Merci pour tout je test sa demain je te tient au courant :slight_smile:

J'ai encore une dernière question.

if((val = Serial.read()) == ????) {

Pour detecter le header je dois mettre quoi 0xBB ou créer une variable byte header[] = {0xBB} ?

Tu dois mettre 0xBB

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