CRC16 рдЪреЗрдХрд╕рдо рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛

рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдбреНрдпреВрдЯреА рдкрд░, рдореИрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдЖрдВрддрд░рд┐рдХ RS485 рдмрд╕ рдкрд░ рдЧрд╣рди рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓рдЧрднрдЧ рдХрдИ рд╣рдЬрд╛рд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдкреИрдХреЗрдЯ 7 рдмрд╛рдЗрдЯреНрд╕ рд▓рдВрдмрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ CC16 рдЪреЗрдХрд╕рдо рдХреЛ рдЕрдкрдиреЗ CIN рд╕рдВрд╕реНрдХрд░рдг (рдмрд╣реБрдкрдж = 0x8005) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп = 0xFFFF)ред рд░рд┐рд╕реЗрдкреНрд╢рди рдПрдлрдЖрдИрдПрдлрдУ рдмрдлрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреА рдмрд╛рдЗрдЯ рдХреЗ рд░рд┐рд╕реЗрдкреНрд╢рди рдХреЗ рдмрд╛рдж рднреАрдбрд╝ рд╕реЗ рдКрдкрд░ рдХреА рдУрд░ рдмрдврд╝рддрд╛ рд╣реИред рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреИрдХреЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЪреЗрдХрд╕рдо рдкреИрдХреЗрдЯ рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдХреЛрдИ рд╣реЗрдбрд░ рдпрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВред

рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереА - рд╕рдордп-рд╕рдордп рдкрд░, рд╣рд░ 5 рдорд┐рдирдЯ рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рдмрд╛рд░, рдбреЗрдЯрд╛ рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдкреИрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлрд┐рд╕рд▓ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХ рдЪреИрдирд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣реНрдп рд░реВрдк рд╕реЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдПрдХ рд╣реА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЖрдЙрдЯрд▓рд╛рдЗрди рд╣реБрдЖред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рднреМрддрд┐рдХ рдЯрдХрд░рд╛рд╡ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдХрд▓рд╛ - рдмрдлрд░ рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╣рд╛рдВ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдПрдХ рдкреИрдХреЗрдЯ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдкреИрдХреЗрдЯ рдХреЗ рдЕрдВрдд рдФрд░ рдЕрдЧрд▓реЗ рдХреА рд╢реБрд░реБрдЖрдд рд╢рд╛рдорд┐рд▓ рдереА, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдкреИрдХреЗрдЯ рдХрд╛ рдЪреЗрдХрд╕рдо рд╕рд╣реА рдирд┐рдХрд▓рд╛ред рдпрд╣реА рд╣реИ, рдЪреЗрдХрд╕рдо рдХреА рдЯрдХреНрдХрд░ рд╣реИ: рдкреИрдХреЗрдЬ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдЪреЗрдХрд╕рдо рджреЗрддрд╛ рд╣реИред

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рддреНрд░реБрдЯрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рд╕реНрдЯрдо рдбрд┐рдЬрд╝рд╛рдЗрди рд╕реНрддрд░ рдкрд░ рдереА, рдХреНрдпреЛрдВрдХрд┐ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдХреЛрдИ рд╣реЗрдбрд░ рдирд╣реАрдВ рдерд╛, рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рдЗрдЯ рд╣реЗрдбрд░ рдХреА рд╢реБрд░реБрдЖрдд рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ undetectable рд╕реНрддрд░ рддрдХ рдХрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдореИрдВрдиреЗ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ 16-рдмрд┐рдЯ рдЪреЗрдХрд╕рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдЗрд╕ рдФрд░ рд▓реЗрдЦ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред

рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдмрд╣реБрдкрдж рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ 16-рдмрд┐рдЯ рдЪреЗрдХрд╕рдореЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛, рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛, рдФрд░ рдмрд┐рдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рд░рд╛рд╢рд┐рдпреЛрдВ рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдкрджрдмрд╣реБрдкрджInitRefinRefOutXorOut
рд╕реАрдПрдордПрд╕0x80050xFFFFрдЭреВрдард╛рдЭреВрдард╛0x0000
CCITT0x10210xFFFFрдЭреВрдард╛рдЭреВрдард╛0x0000
рдЕрдЧрд╕реНрдд-CCITT0x10210x1D0FрдЭреВрдард╛рдЭреВрдард╛0x0000
рдмрд╛рдИрдкрд╛рд╕0x80050x0000рдЭреВрдард╛рдЭреВрдард╛0x0000
CDMA20000xC8670xFFFFрдЭреВрдард╛рдЭреВрдард╛0x0000
DDS-1100x80050x800DрдЭреВрдард╛рдЭреВрдард╛0x0000
DECT рдПрдХреНрд╕0x05890x0000рдЭреВрдард╛рдЭреВрдард╛0x0000
рдПрди 13,7570x3D650x0000рдЭреВрдард╛рдЭреВрдард╛0xFFFF
Modbus0x80050xFFFFрд╕рдЪрд╕рдЪ0x0000
T10-DIF0x8BB70x0000рдЭреВрдард╛рдЭреВрдард╛0x0000
TELEDISK0xA0970x0000рдЭреВрдард╛рдЭреВрдард╛0x0000
XMODEM0x10210x0000рдЭреВрдард╛рдЭреВрдард╛0x0000

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:

  • RefIn - рдбреЗрдЯрд╛ рдмрдлрд░ рд╕реЗ рдмрд┐рдЯреНрд╕ рдХреЗ рдЖрдЧрдорди рдХрд╛ рдХреНрд░рдо: рдЧрд▓рдд - рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ (MSB рдкрд╣рд▓реЗ) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд╕рдЪ - LSB рдкрд╣рд▓реЗ;
  • RefOut - рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмрд┐рдЯреНрд╕ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдЭрдВрдбрд╛: рд╕рдЪ - рдЙрд▓реНрдЯрд╛ред

рдкреИрдХреЗрдЯ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╕рдордп, рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЙрдбрд▓ рд▓рд╛рдЧреВ рдХрд┐рдП:

  • рдлреЗрд░рдмрджрд▓: рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рднрд░рдирд╛
  • рдмрд┐рдЯ рд╢рд┐рдлреНрдЯ: рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ
  • рд░реЛрд▓ рдкреИрдХреЗрдЯ: рд░рд┐рдВрдЧ рдмрд╛рдЗрдЯ рд╢рд┐рдлреНрдЯ рдкреИрдХреЗрдЯ рдореЗрдВ рдмрд╛рдИрдВ рдУрд░
  • рджрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ: рдПрдХ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рджрд╛рдИрдВ рдУрд░ рдкреИрдХреЗрдЯ рд╢рд┐рдлреНрдЯ, 0xFF рдмрд╛рдИрдВ рдУрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди UART рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ)
  • рд▓реЗрдлреНрдЯ рд╢рд┐рдлреНрдЯ: рдкреИрдХреЗрдЯ рдХреЛ рдПрдХ рдмрд╛рдЗрдЯ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдИрдВ рдУрд░, 0xFF рдХреЛ рджрд╛рдИрдВ рдУрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рд╢реВрдиреНрдп рднрд░реЗрдВ: 0x00 рдмрд╛рдЗрдЯреНрд╕ (рд╕рднреА рд╢реВрдиреНрдп) рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рднрд░рдирд╛
  • рд▓реЛрдЧреЛрдВ рдХреЛ рднрд░реЗрдВ: 0xFF рдмрд╛рдЗрдЯреНрд╕ (рд╕рднреА рдЗрдХрд╛рдЗрдпреЛрдВ) рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЯ рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рднрд░рдирд╛
  • рдмрд╛рдЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рди: рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдВ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд╛рдЗрдЯ рдбрд╛рд▓реЗрдВ, рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдмрд╛рдЗрдЯреНрд╕ рдкреВрдВрдЫ рджрд┐рд╢рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ
  • рдПрдХрд▓ рдмрд┐рдЯ: рдПрдХрд▓ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдЯ рдХреЛ рдиреБрдХрд╕рд╛рди

рдлрд┐рд░, рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ 100,000,000 рдкреИрдХреЗрдЯ рдЙрддреНрдкрдиреНрди рдХрд┐рдП, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдиреЗ рдЙрдкрд░реЛрдХреНрдд рдСрдкрд░реЗрд╢рди рдХрд┐рдП, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдореВрд▓ рдФрд░ рдЙрдиреНрдирдд рдкреИрдХреЗрдЬ рдХреЗ рдЪреЗрдХрд╕рдо рдХреА рддреБрд▓рдирд╛ рдХреА рдЧрдИред рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рджреМрд░рд╛рди рдирд╣реАрдВ рдмрджрд▓реЗ рдЧрдП рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдЪреЗрдХрд╕рдо рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рд╣реЛрддреА рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдореНрди рддрд╛рд▓рд┐рдХрд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА:
рдкрджрдорд┐рд╢реНрд░рдгрдмрд┐рдЯ рд╢рд┐рдлреНрдЯрд░реЛрд▓ рдкреИрдХреЗрдЯрд░рд╛рдЗрдЯ рд╢рд┐рдлреНрдЯрд╡рд╛рдо рдкрд╛рд░реАрдЬреАрд░реЛ рднрд░реЗрдВрднрд░рддреЗ рд╣реИрдВрдмрд╛рдЗрдЯ рдЗрдВрдЬреЗрдХреНрд╢рдирдпреЛрдЧ
рд╕реАрдПрдордПрд╕5101387429371439168839704010108024,099
CCITT2012112733201494148610631096113012,728
рдЕрдЧрд╕реНрдд-CCITT2012112733201494148610631096113012,728
рдмрд╛рдИрдкрд╛рд╕5101387429371439168839704010108024,099
CDMA20001368102519461462167810431028111210662
DDS-1105101387429371439168839704010108024,099
DECT рдПрдХреНрд╕1432118959151779158012151209109315412
рдПрди 13,7571281220930431520152821932187103915000
Modbus5090388830861282158239473897107323,845
T10-DIF139092214241421163099493810939812
TELEDISK1394104953981451151210961066106514031
XMODEM2012112733201494148610631096113012,728

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рд╢реБрд░реБрдЖрддреА рдореВрд▓реНрдп рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЪреЗрдХрд╕рдо рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЧрдгрдирд╛ рддрдВрддреНрд░ рдЦреБрдж рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрди рдЬрд╛рдВрдЪреЛрдВ рдХреЛ рдЖрдЧреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ред рдЙрд╕реА рддрд░рд╣, рдПрдХрд▓ рдмрд┐рдЯреНрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рд╕рднреА рдЪреЗрдХрд╕рдо рдмрд┐рдирд╛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реГрдЬрди рдХреЗ рджреМрд░рд╛рди рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред

рдареАрдХ рд╣реИ, рдЪреЗрдХрд╕рдо рдХреА рдЕрдВрддрд┐рдо рдЧреБрдгрд╡рддреНрддрд╛ рддрд╛рд▓рд┐рдХрд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛:
рдкрджрдЯрдХрд░рд╛рд╡ рдХреА рд╕рдВрдЦреНрдпрд╛рдЬрдЧрд╣
рд╕реАрдПрдордПрд╕24,0998
CCITT12,7283
CDMA2000106622
DECT рдПрдХреНрд╕154126
рдПрди 13,757150005
Modbus23,8457
T10-DIF98121
TELEDISK140314

рдореИрдВ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рд╢реЗрд╖ рдирд┐рд╖реНрдХрд░реНрд╖ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВред рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЪреЗрдХрд╕рдо рдмрд╣реБрдкрдж рдореЗрдВ рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓рддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдореЗрд░реА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡реНрдпрдХреНрддрд┐рдкрд░рдХ рд░рд╛рдп рд╣реИред рдЕрдиреНрдп рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгреЛрдВ рдХреЛ рд╕реБрдирдХрд░ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб
#include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <stdbool.h> #include <string.h> #include <time.h> #define PACKET_LEN (7) #define NUM_OF_CYCLES (100000) static unsigned char reverse_table[16] = { 0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE, 0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF }; uint8_t reverse_bits(uint8_t byte) { // Reverse the top and bottom nibble then swap them. return (reverse_table[byte & 0b1111] << 4) | reverse_table[byte >> 4]; } uint16_t reverse_word(uint16_t word) { return ((reverse_bits(word & 0xFF) << 8) | reverse_bits(word >> 8)); } uint16_t crc16_common(uint8_t *data, uint8_t len, uint16_t poly, uint16_t init, uint16_t doXor, bool refIn, bool refOut) { uint8_t y; uint16_t crc; crc = init; while (len--) { if (refIn) crc = ((uint16_t)reverse_bits(*data++) << 8) ^ crc; else crc = ((uint16_t)*data++ << 8) ^ crc; for (y = 0; y < 8; y++) { if (crc & 0x8000) crc = (crc << 1) ^ poly; else crc = crc << 1; } } if (refOut) crc = reverse_word(crc); return (crc ^ doXor); } uint16_t crc16_ccitt(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x1021, 0xFFFF, 0x0000, false, false); } uint16_t crc16_bypass(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x8005, 0x0000, 0x0000, false, false); } uint16_t crc16_xmodem(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x1021, 0x0000, 0x0000, false, false); } uint16_t crc16_teledisk(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0xA097, 0x0000, 0x0000, false, false); } uint16_t crc16_augccitt(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x1021, 0x1d0f, 0x0000, false, false); } uint16_t crc16_cdma2000(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0xc867, 0xffff, 0x0000, false, false); } uint16_t crc16_dds110(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x8005, 0x800d, 0x0000, false, false); } uint16_t crc16_dect(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x0589, 0x0000, 0x0000, false, false); } uint16_t crc16_en13757(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x3d65, 0x0000, 0xffff, false, false); } uint16_t crc16_t10dif(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x8bb7, 0x0000, 0x0000, false, false); } uint16_t crc16_cms(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x8005, 0xFFFF, 0x0000, false, false); } uint16_t crc16_modbus(uint8_t *data, uint8_t len) { return crc16_common(data, len, 0x8005, 0xFFFF, 0x0000, true, true); } bool compare_buf(uint8_t *buf1, uint8_t *buf2) { uint8_t x; for (x = 0; x < PACKET_LEN; x++) { if (buf1[x] != buf2[x]) return true; } return false; } bool method_shuffle(uint8_t *buf) { uint8_t i, j; uint16_t rnd; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); for (i = 0; i < PACKET_LEN; i++) { for (j = 0; j < 10; j++) { rnd = (uint16_t)rand(); if (rnd % 7 == 0) buf[i] ^= (1 << (rnd % 8)); } } return compare_buf(buf, copy); } bool method_bitshift(uint8_t *buf) { uint8_t x, i, j; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); x = (uint8_t)(rand() % PACKET_LEN) + 1; for (j = 0; j < x; j++) { i = (uint8_t)(rand() % PACKET_LEN); if (buf[i] == 0) buf[i] = 0x01; else buf[i] <<= 1; } return compare_buf(buf, copy); } bool method_packetroll(uint8_t *buf) { uint8_t x, i, j; uint8_t temp; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); x = (uint8_t)(rand() % (PACKET_LEN - 1)) + 1; for (j = 0; j < x; j++) { temp = buf[0]; for (i = 0; i < PACKET_LEN - 1; i++) buf[i] = buf[i + 1]; buf[PACKET_LEN - 1] = temp; } return compare_buf(buf, copy); } bool method_shiftright(uint8_t *buf) { uint8_t i; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); for (i = 0; i < PACKET_LEN - 1; i++) buf[i + 1] = buf[i]; buf[0] = 0xff; return compare_buf(buf, copy); } bool method_shiftleft(uint8_t *buf) { uint8_t i; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); for (i = 0; i < PACKET_LEN - 1; i++) buf[i] = buf[i + 1]; buf[PACKET_LEN - 1] = 0xff; return compare_buf(buf, copy); } bool method_zero(uint8_t *buf) { uint8_t x, i, j; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); x = (uint8_t)(rand() % PACKET_LEN) + 1; for (j = 0; j < x; j++) { i = (uint8_t)(rand() % PACKET_LEN); if (buf[i] != 0x00) buf[i] = 0x00; else buf[i] = 0xFF; } return compare_buf(buf, copy); } bool method_one(uint8_t *buf) { uint8_t x, i, j; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); x = (uint8_t)(rand() % PACKET_LEN) + 1; for (j = 0; j < x; j++) { i = (uint8_t)(rand() % PACKET_LEN); if (buf[i] != 0xFF) buf[i] = 0xFF; else buf[i] = 0x00; } return compare_buf(buf, copy); } bool method_injection(uint8_t *buf) { uint8_t x, i; uint8_t copy[PACKET_LEN]; memcpy(copy, buf, PACKET_LEN); x = (uint8_t)(rand() % PACKET_LEN); for (i = PACKET_LEN - 1; i > x; i--) { buf[i] = buf[i - 1]; } buf[x] = (uint8_t)rand(); return compare_buf(buf, copy); } bool method_single(uint8_t *buf) { uint8_t x; x = (uint8_t)(rand() % (PACKET_LEN * 8)); buf[(uint8_t)(x / 8)] ^= (1 << (x % 8)); return true; } typedef struct { uint16_t crc1; uint16_t crc2; uint32_t errors; uint16_t (*fn)(uint8_t *data, uint8_t len); char name[32]; } tCRC; typedef struct { bool (*fn)(uint8_t *buf); char name[32]; } tMethod; static tMethod methods[] = { {method_shuffle, "Shuffle"}, {method_bitshift, "Bit shift"}, {method_packetroll, "Roll packet"}, {method_shiftright, "Right shift"}, {method_shiftleft, "Left shift"}, {method_zero, "Fill zeros"}, {method_one, "Fill ones"}, {method_injection, "Byte injection"}, {method_single, "Single bit"} }; static tCRC crcs[] = { {0, 0, 0, crc16_cms, "CMS"}, {0, 0, 0, crc16_ccitt, "CCITT"}, {0, 0, 0, crc16_augccitt, "AUG-CCITT"}, {0, 0, 0, crc16_bypass, "BYPASS"}, {0, 0, 0, crc16_cdma2000, "CDMA2000"}, {0, 0, 0, crc16_dds110, "DDS-110"}, {0, 0, 0, crc16_dect, "DECT-X"}, {0, 0, 0, crc16_en13757, "EN-13757"}, {0, 0, 0, crc16_modbus, "Modbus"}, {0, 0, 0, crc16_t10dif, "T10-DIF"}, {0, 0, 0, crc16_teledisk, "TELEDISK"}, {0, 0, 0, crc16_xmodem, "XMODEM"} }; int main(int argc, char * argv[]) { uint32_t num_of_cycle; uint32_t num_of_sums; uint8_t packet[PACKET_LEN]; uint8_t i; uint8_t m; //uint8_t buf[8] = {0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17}; srand(time(NULL)); printf("------------------------- CRC16 comparison -------------------------\n"); num_of_sums = sizeof(crcs) / sizeof(tCRC); for (m = 0; m < sizeof(methods) / sizeof(tMethod); m++) { printf("\r%s:\n", methods[m].name); for (i = 0; i < num_of_sums; i++) { crcs[i].errors = 0; } for (num_of_cycle = 0; num_of_cycle < NUM_OF_CYCLES; num_of_cycle++) { for (i = 0; i < PACKET_LEN; i++) packet[i] = (uint8_t)rand(); for (i = 0; i < num_of_sums; i++) crcs[i].crc1 = crcs[i].fn(packet, PACKET_LEN); if (!methods[m].fn(packet)) continue; for (i = 0; i < num_of_sums; i++) { crcs[i].crc2 = crcs[i].fn(packet, PACKET_LEN); if (crcs[i].crc1 == crcs[i].crc2) crcs[i].errors++; } if (num_of_cycle % 1000 == 0) printf("\r%.2f%%", (float)num_of_cycle / NUM_OF_CYCLES * 100); } for (i = 0; i < num_of_sums; i++) printf("\r %20s: %10d\n", crcs[i].name, crcs[i].errors); } return 0; } 


рдирддреАрдЬрддрди, рдЖрдВрддрд░рд┐рдХ рдмрд╕ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрд╛рдж рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, CCITT рдЪреЗрдХрд╕рдо рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдерд╛ред

Source: https://habr.com/ru/post/hi428746/


All Articles