IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Longitudinal Redundancy Check tout court, calculer le LRC


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut Longitudinal Redundancy Check tout court, calculer le LRC
    Bonjour,

    J´ai un peut de problémes pour calculer le LRC.

    Voici la structure du frame lequell le dois lire et écrire.

    (STX)(IDto)(IDFrom)(Lng max 128)(DATA max 128)(LRC)

    STX=‘#’ 1byte
    IDTo=0..255 1byte
    IdFrom=0..255 1byte
    Lng=2..128 1byte Lng=DATA length + LRC
    DATA=0…255 Lng-1bytes
    LRC=0…255 XOR all DATA (DATA0 xor DATA1 xor … DATA lng-1)

    Voici ma définition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //----- Ma structure -----
    Type
    header = record
        STX : Byte; // ansiChar
        IdTo: Byte;
      IdFrom: Byte;
         Lng: Byte;
    end;
    //------end -----------

    Exemple: '#'(61)(0)(10)(1)(60)(60)(0)(0)(0)(0)(0)(0)(1)

    Selon cet exemple mon header serrait STX:# IdTo:61 IdFrom:0 Lng:10
    header.Lng -1 serrait selon exemple 9 <---- ici je ne suis pas sur
    data serrait byteArray (60)(60)(0)(0)(0)(0)(0)(0) - (Lng-1) ? <---- ici ca coince totalement

    La fonction pour calculer le LRC "je l´ai trouvé dans un forum allamand"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    function CalcLRC(Buffer:Array of byte; StartVal:byte):byte;
    var
      x:integer;
    begin
      result := StartVal; // Usually zero, but some protocols start at a different value
      for x := 0 to 8 -1 do
        result := result XOR Buffer[x];
    end;
     
     
    Procedure TTabbedForm.DomoSend(port1: char; port2: char; port3: char;
      port4: char; port5: char; port6: char; port7: char; port8: char);
    var
      Buf, Buf1: String;
      data, data1, data2: String;
      I: Integer;
      Buffer: array of byte;
     
    begin
       SetLength(Buffer, 8);
     
       Buffer[0]:= ord(Port1);//$FF;
       Buffer[1]:= ord(Port2);//$FF;
       Buffer[2]:= ord(Port3);
       Buffer[3]:= ord(Port4);
       Buffer[4]:= ord(Port5);
       Buffer[5]:= ord(Port6);
       Buffer[6]:= ord(Port7);
       Buffer[7]:= ord(Port8);
     
     
      Memo1.Lines.Insert(0,'CalcLRC: '+IntToStr(CalcLRC(Buffer,0)));
     
      data := #$04#$01#$02#$23 + Exo + #$00#$0a#$01 + port1 + port2 + port3 + port4
        + port5 + port6 + port7 + port8 + char(CalcLRC(Buffer,0));
     
      // sock.SendString(data + CRLF);
     
      for I := 1 to High(data) do
      begin
        Buf := data.Substring(4, High(data));
        data1 := Copy(Buf, 1, 1);
        data2 := Copy(Buf, 5, 9);
        // Buf1 := Buf1 + StringToHex(Buf[I]);
        Buf1 := StringToHex(data1 + data2);
      end;
     
      Sock.SendString(data + CRLF);
      if CheckBox1.IsChecked then // debug on
        Memo1.Lines.Insert(0, 'DomoSend: ' + Buf1);
    end;

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    Personne qui peut m´aider?

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Citation Envoyé par jeng37 Voir le message
    Bonjour,

    J´ai un peut de problémes pour calculer le LRC.

    Voici la structure du frame lequell le dois lire et écrire.

    (STX)(IDto)(IDFrom)(Lng max 128)(DATA max 128)(LRC)

    STX=‘#’ 1byte
    IDTo=0..255 1byte
    IdFrom=0..255 1byte
    Lng=2..128 1byte Lng=DATA length + LRC
    DATA=0…255 Lng-1bytes
    LRC=0…255 XOR all DATA (DATA0 xor DATA1 xor … DATA lng-1)

    Voici ma définition:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //----- Ma structure -----
    Type
    header = record
        STX : Byte; // ansiChar
        IdTo: Byte;
      IdFrom: Byte;
         Lng: Byte;
    end;
    //------end -----------
    jusqu'ici tout me parais cohérent

    Exemple: '#'(61)(0)(10)(1)(60)(60)(0)(0)(0)(0)(0)(0)(1)

    Selon cet exemple mon header serrait STX:# IdTo:61 IdFrom:0 Lng:10
    header.Lng -1 serrait selon exemple 9 <---- ici je ne suis pas sur
    data serrait byteArray (60)(60)(0)(0)(0)(0)(0)(0) - (Lng-1) ? <---- ici ca coince totalement

    La fonction pour calculer le LRC "je l´ai trouvé dans un forum allamand"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function CalcLRC(Buffer:Array of byte; StartVal:byte):byte;
    var
      x:integer;
    begin
      result := StartVal; // Usually zero, but some protocols start at a different value
      for x := 0 to 8 -1 do
        result := result XOR Buffer[x];
    end;
    bon là pour eviter les effet de bord sur les tableaux j'aurais fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    function CalcLRC(Buffer:Array of byte; StartVal:byte):byte;
    var
      x:integer;
    begin
      result := StartVal; // Usually zero, but some protocols start at a different value
      for x := low(Buffer)  to high(Buffer) do
        result := result XOR Buffer[x];
    end;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    Procedure TTabbedForm.DomoSend(port1: char; port2: char; port3: char;
      port4: char; port5: char; port6: char; port7: char; port8: char);
    var
      Buf, Buf1: String;
      data, data1, data2: String;
      I: Integer;
      Buffer: array of byte;
    begin
       SetLength(Buffer, 8);
     
       Buffer[0]:= ord(Port1);//$FF;
       Buffer[1]:= ord(Port2);//$FF;
       Buffer[2]:= ord(Port3);
       Buffer[3]:= ord(Port4);
       Buffer[4]:= ord(Port5);
       Buffer[5]:= ord(Port6);
       Buffer[6]:= ord(Port7);
       Buffer[7]:= ord(Port8);
     
     
      Memo1.Lines.Insert(0,'CalcLRC: '+IntToStr(CalcLRC(Buffer,0)));
     
      data := #$04#$01#$02#$23 + Exo + #$00#$0a#$01 + port1 + port2 + port3 + port4
        + port5 + port6 + port7 + port8 + char(CalcLRC(Buffer,0));
     
      // sock.SendString(data + CRLF);
     
      for I := 1 to High(data) do
      begin
        Buf := data.Substring(4, High(data));
        data1 := Copy(Buf, 1, 1);
        data2 := Copy(Buf, 5, 9);
        // Buf1 := Buf1 + StringToHex(Buf[I]);
        Buf1 := StringToHex(data1 + data2);
      end;
    ??? tu veu faire quoi a cette endroits ?
    le substring ne réduit jamais le data donc ta variable buf,data1,data2 et par conséquence buf1 est toujours la même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      Sock.SendString(data + CRLF);
      if CheckBox1.IsChecked then // debug on
        Memo1.Lines.Insert(0, 'DomoSend: ' + Buf1);
    end;
    ?? en quoi ton entête plante je ne vois pas ou tu t'en sert ?
    par contre ce que tu envois me parais pas très coherent
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    En faite, ce n´est pas la procedure Domosend, qui me fait des problèmes.
    Mais plus tot cesi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Déscription:
     
    (STX)(IDto)(IDFrom)(Lng max 128)(DATA max 128)(LRC)
     
    STX=‘#’ 1byte
    IDTo=0..255 1byte
    IdFrom=0..255 1byte
    Lng=2..128 1byte Lng=DATA length + LRC
    DATA=0255 Lng-1bytes
    LRC=0255 XOR all DATA (DATA0 xor DATA1 xor … DATA lng-1)
    Si quelqun pourrait m´expliquer ca plus en détail avec l´exemple suivant.

    Frame exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // Frame: 23 3c 00 0a 01  ff 00 00 00 00 00 00 00 fe
    // Frame Data: ff 00 00 00 00 00 00 00
     
       STX := 23;
      IDTo := 3c;
    IdFrom:= 00;
         Lng:= 0a mais calculer en plus la Lng=DATA length + LRC
       Data:= ff 00 00 00 00 00 00 00; correct?
        LRC:= ?? Dans ce cas le LRC est "fe" 254
    mais la fonction CalcLRC me retourne pas cette valeur.

    Avec Frame Data: 00 00 00 00 00 00 00 00 je devrait avoir la valeur LRC de 01.
    Donc je pense que j´ai un problème avec la fontion CalcLRC.

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    pour une Frame valant 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe

    STX := 23;
    IDTo := 3c;
    IdFrom:= 00;
    Lng:= 0a // soit Len(Data) = 9 +1 pour LRC donc 10 au total
    Data:= 01 ff 00 00 00 00 00 00 00 // longueur 9
    LRC:= fe : CQFD

    et pour Data: 00 00 00 00 00 00 00 00 // longueur 8 ; LRC = 00 et non 01
    la Frame vaut 23 3c 00 09 00 00 00 00 00 00 00 00 00
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    pour une Frame valant 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe

    STX := 23;
    IDTo := 3c;
    IdFrom:= 00;
    Lng:= 0a // soit Len(Data) = 9 +1 pour LRC donc 10 au total
    Data:= 01 ff 00 00 00 00 00 00 00 // longueur 9
    LRC:= fe : CQFD

    et pour Data: 00 00 00 00 00 00 00 00 // longueur 8 ; LRC = 00 et non 01
    la Frame vaut 23 3c 00 09 00 00 00 00 00 00 00 00 00
    Hmm...
    La Frame 23 3c 00 0a 01 ff 00 00 00 00 00 00 00 fe est correcte!
    mais pour Data 00 00 00 00 00 00 00 00 pas car
    dans wireshark j´ai 23 3c 00 0a 01 00 00 00 00 00 00 00 00 01

  7. #7
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    dans wireshark j´ai 23 3c 00 0a 01 00 00 00 00 00 00 00 00 01
    Si j'en crois la structure décrite :
    STX = 23
    aTo = 3C
    aFrom = 00
    aLength = 0A soit 9 caractères de DATA + LRC
    DATA = 01 00 00 00 00 00 00 00 00
    LRC = 01 : correct
    ce qui valide la trame.

    Donc quand tu écris que cette trame correspond à celle attendue pour DATA = 00 00 00 00 00 00 00 00, il y a un hic ! Tu te trompes soit sur la trame attendue, soit sur la structure de la trame...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Juillet 2015
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Juillet 2015
    Messages : 64
    Points : 35
    Points
    35
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Si j'en crois la structure décrite :
    ...

    Donc quand tu écris que cette trame correspond à celle attendue pour DATA = 00 00 00 00 00 00 00 00, il y a un hic ! Tu te trompes soit sur la trame attendue, soit sur la structure de la trame...
    La trame et la structure sont correcte, et oui, c´est moi qui c´est trompé, j´ai pris DATA a 8 bit au lieu de 9.
    Maintenant ca fonctionne!
    Un seul bit peut fair la solution ou l´échec.
    Je suis désole pour cela!

    Merci pour ton aide, et aussi aux autres! Merci.

  9. #9
    Membre confirmé
    Homme Profil pro
    Santé
    Inscrit en
    Septembre 2010
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Santé
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2010
    Messages : 290
    Points : 534
    Points
    534
    Par défaut
    Seigneur.
    Faites que Jipété ne vienne jamais traîner ici !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calculer le bit de parité horizontale (LRC)
    Par hissokaaaa dans le forum C
    Réponses: 6
    Dernier message: 29/03/2011, 15h50
  2. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  3. Calcul des numéros de semaine d'un calendrier
    Par Invité dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 06/11/2002, 21h29
  4. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 02h35
  5. Algo de calcul de FFT
    Par djlex03 dans le forum Traitement du signal
    Réponses: 15
    Dernier message: 02/08/2002, 17h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo