IGC IMS-EX2400NB(6) краткое описание протокола modbus_rtu онлайн [4/20] 612191

IGC IMS-EX2400NB(6) краткое описание протокола modbus_rtu онлайн [4/20] 612191
Контрольная сумма подсчитывается и добавляется в конец фрейма передающим
устройством, и сравнивается принимающим устройством с контрольной суммой, подсчитанной им
по принятым данным.
В подсчете контрольной суммы используются все байты фрейма, начиная с первого (адреса).
Подсчет контрольной суммы производится следующим образом:
1) Записывается в 16-ти битный регистр CRC число 0xFFFF.
2) Первому байту данных и регистру CRC применяется функция XOR, результат помещается
в CRC регистр;
3) Регистр CRC сдвигается вправо на 1 бит, старший бит CRC регистра устанавливается в 0.
Проверяется сдвинутый бит CRC регистра.
4) Если сдвинутый бит CRC регистра равен 1, то CRC регистру и полиномиальному числу
(например 0xA001) применяется функция XOR;
5) Выполняются пункты 3,4, пока не будет выполнено 8 сдвигов CRC регистра;
6) Следующему байту данных и регистру CRC применяется функция XOR, результат
помещается в CRC регистр;
6) Повторяются действия по пунктам 3-6 для оставшихся данных.
7) Контрольная сумма передается в фрейме младшим байтом вперед, т.е. в формате
LSB|MSB.
Возможна также табличная форма подсчета контрольной суммы, что значительно ускоряет
процесс подсчета.
Функция подсчета CRC16 на языке си имеет вид:
unsigned short CRC16 ( puchMsg, usDataLen )
unsigned char *puchMsg ;
unsigned short usDataLen ;
{
unsigned char uchCRCHi = 0xFF ; /* high byte of CRC initialized */
unsigned char uchCRCLo = 0xFF ; /* low byte of CRC initialized */
unsigned uIndex ; /* will index into CRC lookup table */
while (usDataLen--) /* pass through message buffer */
{
uIndex = uchCRCLo ^ *puchMsgg++ ; /* calculate the CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex} ;
uchCRCHi = auchCRCLo[uIndex] ;

Похожие устройства