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

    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 with 0s in the MSB. Maybe the same applies to single byte fields? As you receive the data, I would just ignore this, the chances that data is corrupted are probably very low. To test how frequent data gets corrupted I would keep the lidar running for a lot of time while recording the data. After a long log I would check the data, if there are no outliers, data is probable ok.

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

    Woa...I definitely didn't read down far enough.  I assumed the check code started for the sample data, but rather, its a mess of a combination with all data in the packet excluding the Check Code itself.

     

    This is like sudoku for me, so, I'm going to give it another couple of hours and see if I can crack it.  If I do, I'll post the code.

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
  • Sean_Miller
    Sean_Miller over 5 years ago in reply to Sean_Miller

    Hot Dog!  Got it.

     

    I have no idea why the docs have that confusing statement "since sample data is 3 bytes".  It doesn't say that its 3 bytes anywhere else in the document.  So, I didn't do anything with that.  I just dropped the check code bytes slapped on the rest of the bytes in the packet in the order they came.

     

    Here's a way to look at it:

    • Make two columns of bytes.  Byte 1 is row 1 left, Byte 2 in row 1 right.  Byte 3 is row 2 left, Byte 4 is Row 2 right.  On and on until the next packet starts.
    • Compound XOR each row.
    • For example, starting with decimal 170, 85 for the first block and then 249, 49 for the second as in Line 4 of the code, it looks like this in binary.  You are XORing the next row against the result of the previous XOR operation:

      

    1010101001010101
    XORXOR
    1111100100110001
    XORXOR
    ……
    ==
    630E

     

    Which is precisely the bytes at the CS item of the parameter.

     

    Here is the VB code to pull it off.

     

    'VB code for checksum of YDLIDAR X2 data packet
    Sub doer()
        'PH (2 bytes in order they streamed), FSA (2 Bytes in order they streamed), S1, Sx, CT (one Byte), LS (one byte), LSA (two bytes the ordered they streamed)
        MsgBox (my_checksum("170,85,249,49,0,0,182,12,228,12,30,5,29,5,0,0,50,13,0,0,0,0,36,13,4,13,244,12,228,12,216,12,204,12,201,12,185,12,177,12,169,12,165,12,161,12,153,12,153,12,149,12,149,12,145,12,145,12,145,12,145,12,145,12,149,12,157,12,161,12,161,12,165,12,177,12,181,12,193,12,197,12,208,12, 0,40,247,67"))
    End Sub
    Function my_checksum(str As String) As String
        Dim bytes() As String
        Dim left_byte(100) As Byte
        Dim right_byte(100) As Byte
        Dim left_xor As Byte
        Dim right_xor As Byte
        Dim tt As Integer
        
        bytes = Split(str, ",")
        
        ' tt will index the new byte array we parse
        tt = 0
        ' Convert the strings to integers and then to bytes.  Make a left column and right column to process next with the xor operation
        For ii = 0 To UBound(bytes) - 1 Step 2
            left_byte(tt) = CByte(CInt(bytes(ii)))
            right_byte(tt) = CByte(CInt(bytes(ii + 1)))
            tt = tt + 1
        Next
        
        ' tt will now represent the upper bound of our byte arrays below
        tt = tt - 1
        
        
        left_xor = 0
        right_xor = 0
        
        ' perform the xor operation in double byte fashion
        For ii = 0 To tt
            left_xor = left_xor Xor left_byte(ii)
            right_xor = right_xor Xor right_byte(ii)
        Next
        
        my_checksum = ((Hex(left_xor) & " " & Hex(right_xor)))
    End Function

     

     

    For info, the reason this interests me is because the SDK for the YDLIDAR has a very robust CMAKE file and c++ library that is great for Windows and Linux boxes.  But, it isn't too attractive for embedded devices like the Azure Sphere and Arduino.  If I make a simple C routine to snoop serial packets, its all I would need to get the point cloud data its senses without any overhead.

     

    See ya',

    Sean

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Reply
  • Sean_Miller
    Sean_Miller over 5 years ago in reply to Sean_Miller

    Hot Dog!  Got it.

     

    I have no idea why the docs have that confusing statement "since sample data is 3 bytes".  It doesn't say that its 3 bytes anywhere else in the document.  So, I didn't do anything with that.  I just dropped the check code bytes slapped on the rest of the bytes in the packet in the order they came.

     

    Here's a way to look at it:

    • Make two columns of bytes.  Byte 1 is row 1 left, Byte 2 in row 1 right.  Byte 3 is row 2 left, Byte 4 is Row 2 right.  On and on until the next packet starts.
    • Compound XOR each row.
    • For example, starting with decimal 170, 85 for the first block and then 249, 49 for the second as in Line 4 of the code, it looks like this in binary.  You are XORing the next row against the result of the previous XOR operation:

      

    1010101001010101
    XORXOR
    1111100100110001
    XORXOR
    ……
    ==
    630E

     

    Which is precisely the bytes at the CS item of the parameter.

     

    Here is the VB code to pull it off.

     

    'VB code for checksum of YDLIDAR X2 data packet
    Sub doer()
        'PH (2 bytes in order they streamed), FSA (2 Bytes in order they streamed), S1, Sx, CT (one Byte), LS (one byte), LSA (two bytes the ordered they streamed)
        MsgBox (my_checksum("170,85,249,49,0,0,182,12,228,12,30,5,29,5,0,0,50,13,0,0,0,0,36,13,4,13,244,12,228,12,216,12,204,12,201,12,185,12,177,12,169,12,165,12,161,12,153,12,153,12,149,12,149,12,145,12,145,12,145,12,145,12,145,12,149,12,157,12,161,12,161,12,165,12,177,12,181,12,193,12,197,12,208,12, 0,40,247,67"))
    End Sub
    Function my_checksum(str As String) As String
        Dim bytes() As String
        Dim left_byte(100) As Byte
        Dim right_byte(100) As Byte
        Dim left_xor As Byte
        Dim right_xor As Byte
        Dim tt As Integer
        
        bytes = Split(str, ",")
        
        ' tt will index the new byte array we parse
        tt = 0
        ' Convert the strings to integers and then to bytes.  Make a left column and right column to process next with the xor operation
        For ii = 0 To UBound(bytes) - 1 Step 2
            left_byte(tt) = CByte(CInt(bytes(ii)))
            right_byte(tt) = CByte(CInt(bytes(ii + 1)))
            tt = tt + 1
        Next
        
        ' tt will now represent the upper bound of our byte arrays below
        tt = tt - 1
        
        
        left_xor = 0
        right_xor = 0
        
        ' perform the xor operation in double byte fashion
        For ii = 0 To tt
            left_xor = left_xor Xor left_byte(ii)
            right_xor = right_xor Xor right_byte(ii)
        Next
        
        my_checksum = ((Hex(left_xor) & " " & Hex(right_xor)))
    End Function

     

     

    For info, the reason this interests me is because the SDK for the YDLIDAR has a very robust CMAKE file and c++ library that is great for Windows and Linux boxes.  But, it isn't too attractive for embedded devices like the Azure Sphere and Arduino.  If I make a simple C routine to snoop serial packets, its all I would need to get the point cloud data its senses without any overhead.

     

    See ya',

    Sean

    • Cancel
    • Vote Up 0 Vote Down
    • Sign in to reply
    • Cancel
Children
No Data
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