CRC16UNI
Contents |
Action
Returns the CRC16 value of a variable or array.
Syntax
Var = CRC16UNI( source ,length , initial, polynomial,refin,refout)
Remarks
var |
The variable that is assigned with the CRC16 of variable source. Should be a word or integer variable. |
source |
The source variable or first element of the array to get the CRC16 value from. |
length |
The number of bytes to check. |
initial |
The initial value of the CRC. This is usual 0 or &HFFFF. |
polynomial |
The polynomial value to use. |
refin |
Reflect the data input bits. Use 0 to disable this option. Use a non-zero value to enable this option. |
refout |
Reflect the data output. Use 0 to disable this option. Use a non-zero value to enable this option. |
CRC16 is used in communication protocols to check if there are no transmission errors.
The 1wire for example returns a CRC byte as the last byte from it’s ID.
Use CRC8 for the 1wire routines.
There are a lot of different CRC16 routines. There is no real standard since the polynomial will vary from manufacture to manufacture.
At http://www.ross.net/crc/download/crc_v3.txt you can find a great document about CRC calculation from Ross N. Williams. At the end you will find an example that is good for dealing with most CRC variations. The BASCOM CRC16UNI function is a conversion of this example.
There is a difference however : The CRC16UNI function does not XOR the output bytes. This because most CRC functions XOR with 0.
The example will show some of the most used combinations.
See also
CHECKSUM , CRC8, CRC16 , CRC32 , TCPCHECKSUM
Example
'------------------------------------------------------------------------------ 'name : crc8-16-32.bas 'copyright : (c) 1995-2008, MCS Electronics 'purpose : demonstrates CRC 'micro : Mega48 'suited for demo : yes 'commercial addon needed : no '------------------------------------------------------------------------------ $regfile = "m48def.dat" ' specify the used micro $crystal = 8000000 ' used crystal frequency $baud = 19200 ' use baud rate $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default use 10 for the SW stack $framesize = 40 ' default use 40 for the frame space Dim Ar(10) As Byte Dim J As Byte Dim W As Word Dim L As Long Dim S As String * 16 S = "123456789" Ar(1) = 1 Ar(2) = 2 Ar(3) = 3 J = Crc8(ar(1) , 3) 'calculate value which is 216 W = Crc16(ar(1) , 3) '24881 L = Crc32(ar(1) , 3) '494976085 ' data , length, intial value , Poly, reflect input, reflect output Print Hex(crc16uni(s , 9 , 0 , &H1021 , 0 , 0)) 'CRC-CCITT (0x0000) 31C3 Print Hex(crc16uni(s , 9 , &HFFFF , &H1021 , 0 , 0)) 'CRC-CCITT (0xFFFF) 29B1 Print Hex(crc16uni(s , 9 , &H1D0F , &H1021 , 0 , 0)) 'CRC-CCITT (0x1D0F) E5CC Print Hex(crc16uni(s , 9 , 0 , &H8005 , 1 , 1)) 'crc16 BB3D Print Hex(crc16uni(s , 9 , &HFFFF , &H8005 , 1 , 1)) 'crc16-modbus 4B37 End
Languages | English • Deutsch |
---|