element14 Community
element14 Community
    Register Log In
  • Site
  • Search
  • Log In Register
  • About Us
  • Community Hub
    Community Hub
    • What's New on element14
    • Feedback and Support
    • Benefits of Membership
    • Personal Blogs
    • Members Area
    • Achievement Levels
  • Learn
    Learn
    • Ask an Expert
    • eBooks
    • element14 presents
    • Learning Center
    • Tech Spotlight
    • STEM Academy
    • Webinars, Training and Events
    • Learning Groups
  • Technologies
    Technologies
    • 3D Printing
    • FPGA
    • Industrial Automation
    • Internet of Things
    • Power & Energy
    • Sensors
    • Technology Groups
  • Challenges & Projects
    Challenges & Projects
    • Design Challenges
    • element14 presents Projects
    • Project14
    • Arduino Projects
    • Raspberry Pi Projects
    • Project Groups
  • Products
    Products
    • Arduino
    • Avnet Boards Community
    • Dev Tools
    • Manufacturers
    • Multicomp Pro
    • Product Groups
    • Raspberry Pi
    • RoadTests & Reviews
  • Store
    Store
    • Visit Your Store
    • Choose another store...
      • Europe
      •  Austria (German)
      •  Belgium (Dutch, French)
      •  Bulgaria (Bulgarian)
      •  Czech Republic (Czech)
      •  Denmark (Danish)
      •  Estonia (Estonian)
      •  Finland (Finnish)
      •  France (French)
      •  Germany (German)
      •  Hungary (Hungarian)
      •  Ireland
      •  Israel
      •  Italy (Italian)
      •  Latvia (Latvian)
      •  
      •  Lithuania (Lithuanian)
      •  Netherlands (Dutch)
      •  Norway (Norwegian)
      •  Poland (Polish)
      •  Portugal (Portuguese)
      •  Romania (Romanian)
      •  Russia (Russian)
      •  Slovakia (Slovak)
      •  Slovenia (Slovenian)
      •  Spain (Spanish)
      •  Sweden (Swedish)
      •  Switzerland(German, French)
      •  Turkey (Turkish)
      •  United Kingdom
      • Asia Pacific
      •  Australia
      •  China
      •  Hong Kong
      •  India
      •  Korea (Korean)
      •  Malaysia
      •  New Zealand
      •  Philippines
      •  Singapore
      •  Taiwan
      •  Thailand (Thai)
      • Americas
      •  Brazil (Portuguese)
      •  Canada
      •  Mexico (Spanish)
      •  United States
      Can't find the country/region you're looking for? Visit our export site or find a local distributor.
  • Translate
  • Profile
  • Settings
Amphenol
  • Products
  • Manufacturers
  • Amphenol
  • More
  • Cancel
Amphenol
Forum How to do a Double Byte XOR Checksum?
  • Blog
  • Forum
  • Documents
  • Events
  • Leaderboard
  • Polls
  • Members
  • Mentions
  • Sub-Groups
  • Tags
  • More
  • Cancel
  • New
Join Amphenol to participate - click to join for free!
Actions
  • Share
  • More
  • Cancel
Forum Thread Details
  • Replies 10 replies
  • Subscribers 23 subscribers
  • Views 5057 views
  • Users 0 members are here
  • checksum
  • data packets
  • serial communication
Related

How to do a Double Byte XOR Checksum?

Sean_Miller
Sean_Miller over 5 years ago

I have a data packet that states its data validation (check code) is verified by a double byte XOR.  I've Googled for a tutorial and came up empty.  I've tried to solve the puzzle in Excel to never get a match to serial data I captured with Putty.  I could use a tip on how the algorithm to apply.

 

The packet description is below.  Starting at position 8, the two byte CS item contains the check code and states it uses a double-byte XOR to verify the current data packet.  I've tried adding up all bytes starting at Si in series which equates to a two byte value.  I XOR it against the CS value I've assed to be xC4AD, but that didn't resolve to 0.

 

Should I be XORing blocks of 2 bytes and comparing to the CS value? 

 

 

image

 

image

 

Example packet:

        

AA 55 00 28 85 AE 9D 0C AD C4 00 00 00 00 00 00 32 00 00 2A 12 59 12 00 00 00 00 A6 1F E5 1F 8D 1F 6D 1F 0A 17 7D 17 62 55 09 1D B1 10 31 10 4D 10 7A 0F 61 0F 5D 0F 21 0F 19 0F 31 0F 49 0F 8D 0F 4E 6D 6D 1D 82 0D 84 0D 00 00 AE 1A 9D 1A 89 1A
  • Sign in to reply
  • Cancel

Top Replies

  • neuromodulator
    neuromodulator over 5 years ago +1
    It might be some parity check. Try to XOR all blocks of 2 bytes and check what you get
  • neuromodulator
    neuromodulator over 5 years ago +1
    Check the last part of the document: http://www.ydlidar.com/Public/upload/files/2019-12-18/YDLIDAR%20X2%20Development%20Manual.pdf It's poorly written, but they say that in case of 3 bytes 1 byte get padded…
  • neuromodulator
    neuromodulator over 5 years ago +1
    Leave the lidar scanning for a while and letme know if you find a checksum error. I suspect thst you wont
Parents
  • neuromodulator
    neuromodulator over 5 years ago

    Leave the lidar scanning for a while and letme know if you find a checksum error. I suspect thst you wont

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Cancel
  • Sean_Miller
    Sean_Miller over 5 years ago in reply to neuromodulator

    Yep...had a bug in that I was not XORing the full bounds of the sample data array in my ported Arduino code.  It's now 100% as you said!  The "Good Data" in my post a few minutes ago must have occurred when the Last Angle's (LSA) most significant byte was zero so it didn't affect the checksum.

     

    All that is happening here within .001 seconds absolutely boggles my mind and inspires me that the world should become an amazing place for our kids.

     

    Arduino code is below.  One could readily expand this to decipher object distance at given angles around the YDLIDAR or log a point map for importing into software to establish a geometry from a point cloud.  This approach is much, much leaner than their SDK and good for the likes of Arduino and the Azure Sphere Starter Kit.

     

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 212, 74  New Checksum: 212, 74

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 59, 83  New Checksum: 59, 83

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 3, 15  New Checksum: 3, 15

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 84, 101  New Checksum: 84, 101

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 218, 107  New Checksum: 218, 107

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 97, 95  New Checksum: 97, 95

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 133, 244  New Checksum: 133, 244

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 129, 92  New Checksum: 129, 92

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 171, 26  New Checksum: 171, 26

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 5, 155  New Checksum: 5, 155

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 90, 72  New Checksum: 90, 72

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 158, 81  New Checksum: 158, 81

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 169, 15  New Checksum: 169, 15

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 37, 96  New Checksum: 37, 96

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 72, 107  New Checksum: 72, 107

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 139, 98  New Checksum: 139, 98

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 66, 185  New Checksum: 66, 185

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 205, 70  New Checksum: 205, 70

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 157, 30  New Checksum: 157, 30

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 92, 236  New Checksum: 92, 236

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 250, 106  New Checksum: 250, 106

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 93, 85  New Checksum: 93, 85

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 51, 15  New Checksum: 51, 15

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 214, 104  New Checksum: 214, 104

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 129, 106  New Checksum: 129, 106

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 20, 95  New Checksum: 20, 95

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 237, 251  New Checksum: 237, 251

    20:06:07.435 -> Good:  Samples Sent:  40 Checksum: 108, 93  New Checksum: 108, 93

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 53, 74  New Checksum: 53, 74

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 140, 149  New Checksum: 140, 149

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 178, 117  New Checksum: 178, 117

     

     

    bool first_byte_received;
    bool second_byte_received;
    int incomingByte;
    
    
    void setup() {
      Serial.begin(115200);
      first_byte_received=false;
      second_byte_received=false;
    }
    
    
    void loop() {
      // Poll for our expected 3 bytes that reflect the packet header.
      if (Serial.available()) {      // If anything comes in Serial (USB),
        incomingByte=Serial.read();
        //Serial.println(incomingByte);
        if (!first_byte_received) {
          if (incomingByte==170) first_byte_received=true;
        }
        else if(!second_byte_received) {
          if (incomingByte==85) {
            second_byte_received=true;
          }
          else
          {
            first_byte_received=false;
          }
        }
        else
        {
          if (incomingByte==0) {
            first_byte_received=false;
            second_byte_received=false;
            ReceivePacket();
          }
          else
          {
            first_byte_received=false;
            second_byte_received=false;
          }
        }
      }
    }
    
    
    void ReceivePacket() {
      int samples_sent, starting_angle_LSB, starting_angle_MSB, end_angle_LSB, end_angle_MSB;
      int check_code_LSB, check_code_MSB;
      int left_column[50], right_column[50];
      int sample_bytes[100];
      
      while (!Serial.available());
      samples_sent=Serial.read();
    
    
      // Expect no more than 40 really, but just in case, just punt if more than 50.
      if (samples_sent>50) {    
        return;
      }
      
      while (!Serial.available());
      starting_angle_LSB=Serial.read();
      while (!Serial.available());
      starting_angle_MSB=Serial.read();
      while (!Serial.available());
      end_angle_LSB=Serial.read();
      while (!Serial.available());
      end_angle_MSB=Serial.read();
      while (!Serial.available());
      check_code_LSB=Serial.read();
      while (!Serial.available());
      check_code_MSB=Serial.read();
      
      for (int ii=0;ii<((2*samples_sent)); ii++) 
      {
        while (!Serial.available());  
        sample_bytes[ii]=Serial.read();
      }
      
      // Perform checksum
      int left_checksum=0;
      int right_checksum=0;
      
      left_checksum=left_checksum ^ 170;
      right_checksum=right_checksum ^ 85;
      
      left_checksum=left_checksum ^ starting_angle_LSB;
      right_checksum=right_checksum ^ starting_angle_MSB;
    
    
      for (int ii=0; ii<((samples_sent*2)-1); ii+=2)
      {
        left_checksum=left_checksum ^ sample_bytes[ii];
        right_checksum=right_checksum ^ sample_bytes[ii+1];
      }
      
      left_checksum=left_checksum ^ 0;
      right_checksum=right_checksum ^ samples_sent; 
    
    
      left_checksum=left_checksum ^ end_angle_LSB;
      right_checksum=right_checksum ^ end_angle_MSB;
      
      String assessment="Bad";
      if (left_checksum==check_code_LSB&&right_checksum==check_code_MSB) assessment="Good";
      Serial.println(assessment + ":  Samples Sent:  " + String(samples_sent) + " Checksum: " + String(check_code_LSB) + ", " + String(check_code_MSB) + "  New Checksum: " + String(left_checksum) + ", " + String(right_checksum) );
      while
    (Serial.available()){Serial.read();}
    
    }

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • Sean_Miller
    Sean_Miller over 5 years ago in reply to neuromodulator

    Yep...had a bug in that I was not XORing the full bounds of the sample data array in my ported Arduino code.  It's now 100% as you said!  The "Good Data" in my post a few minutes ago must have occurred when the Last Angle's (LSA) most significant byte was zero so it didn't affect the checksum.

     

    All that is happening here within .001 seconds absolutely boggles my mind and inspires me that the world should become an amazing place for our kids.

     

    Arduino code is below.  One could readily expand this to decipher object distance at given angles around the YDLIDAR or log a point map for importing into software to establish a geometry from a point cloud.  This approach is much, much leaner than their SDK and good for the likes of Arduino and the Azure Sphere Starter Kit.

     

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 212, 74  New Checksum: 212, 74

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 59, 83  New Checksum: 59, 83

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 3, 15  New Checksum: 3, 15

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 84, 101  New Checksum: 84, 101

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 218, 107  New Checksum: 218, 107

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 97, 95  New Checksum: 97, 95

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 133, 244  New Checksum: 133, 244

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 129, 92  New Checksum: 129, 92

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 171, 26  New Checksum: 171, 26

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 5, 155  New Checksum: 5, 155

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 90, 72  New Checksum: 90, 72

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 158, 81  New Checksum: 158, 81

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 169, 15  New Checksum: 169, 15

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 37, 96  New Checksum: 37, 96

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 72, 107  New Checksum: 72, 107

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 139, 98  New Checksum: 139, 98

    20:06:07.391 -> Good:  Samples Sent:  40 Checksum: 66, 185  New Checksum: 66, 185

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 205, 70  New Checksum: 205, 70

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 157, 30  New Checksum: 157, 30

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 92, 236  New Checksum: 92, 236

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 250, 106  New Checksum: 250, 106

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 93, 85  New Checksum: 93, 85

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 51, 15  New Checksum: 51, 15

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 214, 104  New Checksum: 214, 104

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 129, 106  New Checksum: 129, 106

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 20, 95  New Checksum: 20, 95

    20:06:07.423 -> Good:  Samples Sent:  40 Checksum: 237, 251  New Checksum: 237, 251

    20:06:07.435 -> Good:  Samples Sent:  40 Checksum: 108, 93  New Checksum: 108, 93

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 53, 74  New Checksum: 53, 74

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 140, 149  New Checksum: 140, 149

    20:06:07.469 -> Good:  Samples Sent:  40 Checksum: 178, 117  New Checksum: 178, 117

     

     

    bool first_byte_received;
    bool second_byte_received;
    int incomingByte;
    
    
    void setup() {
      Serial.begin(115200);
      first_byte_received=false;
      second_byte_received=false;
    }
    
    
    void loop() {
      // Poll for our expected 3 bytes that reflect the packet header.
      if (Serial.available()) {      // If anything comes in Serial (USB),
        incomingByte=Serial.read();
        //Serial.println(incomingByte);
        if (!first_byte_received) {
          if (incomingByte==170) first_byte_received=true;
        }
        else if(!second_byte_received) {
          if (incomingByte==85) {
            second_byte_received=true;
          }
          else
          {
            first_byte_received=false;
          }
        }
        else
        {
          if (incomingByte==0) {
            first_byte_received=false;
            second_byte_received=false;
            ReceivePacket();
          }
          else
          {
            first_byte_received=false;
            second_byte_received=false;
          }
        }
      }
    }
    
    
    void ReceivePacket() {
      int samples_sent, starting_angle_LSB, starting_angle_MSB, end_angle_LSB, end_angle_MSB;
      int check_code_LSB, check_code_MSB;
      int left_column[50], right_column[50];
      int sample_bytes[100];
      
      while (!Serial.available());
      samples_sent=Serial.read();
    
    
      // Expect no more than 40 really, but just in case, just punt if more than 50.
      if (samples_sent>50) {    
        return;
      }
      
      while (!Serial.available());
      starting_angle_LSB=Serial.read();
      while (!Serial.available());
      starting_angle_MSB=Serial.read();
      while (!Serial.available());
      end_angle_LSB=Serial.read();
      while (!Serial.available());
      end_angle_MSB=Serial.read();
      while (!Serial.available());
      check_code_LSB=Serial.read();
      while (!Serial.available());
      check_code_MSB=Serial.read();
      
      for (int ii=0;ii<((2*samples_sent)); ii++) 
      {
        while (!Serial.available());  
        sample_bytes[ii]=Serial.read();
      }
      
      // Perform checksum
      int left_checksum=0;
      int right_checksum=0;
      
      left_checksum=left_checksum ^ 170;
      right_checksum=right_checksum ^ 85;
      
      left_checksum=left_checksum ^ starting_angle_LSB;
      right_checksum=right_checksum ^ starting_angle_MSB;
    
    
      for (int ii=0; ii<((samples_sent*2)-1); ii+=2)
      {
        left_checksum=left_checksum ^ sample_bytes[ii];
        right_checksum=right_checksum ^ sample_bytes[ii+1];
      }
      
      left_checksum=left_checksum ^ 0;
      right_checksum=right_checksum ^ samples_sent; 
    
    
      left_checksum=left_checksum ^ end_angle_LSB;
      right_checksum=right_checksum ^ end_angle_MSB;
      
      String assessment="Bad";
      if (left_checksum==check_code_LSB&&right_checksum==check_code_MSB) assessment="Good";
      Serial.println(assessment + ":  Samples Sent:  " + String(samples_sent) + " Checksum: " + String(check_code_LSB) + ", " + String(check_code_MSB) + "  New Checksum: " + String(left_checksum) + ", " + String(right_checksum) );
      while
    (Serial.available()){Serial.read();}
    
    }

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Cancel
Children
  • neuromodulator
    neuromodulator over 5 years ago in reply to Sean_Miller

    I'm glade you got it working. I've never used a LIDAR but can imagine they are quite fun.

    • Cancel
    • Vote Up +1 Vote Down
    • Sign in to reply
    • Cancel
element14 Community

element14 is the first online community specifically for engineers. Connect with your peers and get expert answers to your questions.

  • Members
  • Learn
  • Technologies
  • Challenges & Projects
  • Products
  • Store
  • About Us
  • Feedback & Support
  • FAQs
  • Terms of Use
  • Privacy Policy
  • Legal and Copyright Notices
  • Sitemap
  • Cookies

An Avnet Company © 2025 Premier Farnell Limited. All Rights Reserved.

Premier Farnell Ltd, registered in England and Wales (no 00876412), registered office: Farnell House, Forge Lane, Leeds LS12 2NE.

ICP 备案号 10220084.

Follow element14

  • X
  • Facebook
  • linkedin
  • YouTube