int crc_chk(unsigned char* data, unsigned char length)
{
register int j; // register - спецификатор, который предполагает, что доступ к объекту будет быстрым
register unsigned int reg_crc = 0xFFFF; //объявление 16-битного регистра
while (length--)
{
reg_crc ^= *data++; //каждый байт-исключение складывается по исключающему ИЛИ с текущим значением регистра контр суммы. После последнего 8 сдвига следующий байт складывается с текущей величиной регистра контр суммы и процесс сдвига повторяется повторно 8 раз
for (j = 0; j < 8; j++)
{
if (reg_crc & 0x01) //проверка младшего бита
{
reg_crc = (reg_crc >> 1) ^ 0xA001; //проверочный код на основе полинома. Результат всегда сдвигается в сторону младшего бита с заполнением нулем старшего бита. Если младший бит = 1, то производится искл ИЛИ содержимого регистра контр суммы и полиномиального числа
}
else
{
reg_crc = reg_crc >> 1; //если младший бит = 0, искл ИЛИ не делается
}
}
}
return reg_crc; //регистр хранения конечного результата контр суммы
}
int main(void)
{
while (1)
{
asm(“nop”);
RCR = crc_chk(RX_modbus_rtu, 6); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке
}
}
#include <avr/io.h>
Unsigned char RX_modbus_rtu[15] = { 10, 1, 0, 6, 1, 28, 176 }; // 0A0100060001
Unsigned int RCR;
int crc_chk(unsigned char* data, unsigned char length)
{
register int j; // register - спецификатор, который предполагает, что доступ к объекту будет быстрым
register unsigned int reg_crc = 0xFFFF; //объявление 16-битного регистра
while (length--)
{
reg_crc ^= *data++; //каждый байт-исключение складывается по исключающему ИЛИ с текущим значением регистра контр суммы. После последнего 8 сдвига следующий байт складывается с текущей величиной регистра контр суммы и процесс сдвига повторяется повторно 8 раз
for (j = 0; j < 8; j++)
{
if (reg_crc & 0x01) //проверка младшего бита
{
reg_crc = (reg_crc >> 1) ^ 0xA001; //проверочный код на основе полинома. Результат всегда сдвигается в сторону младшего бита с заполнением нулем старшего бита. Если младший бит = 1, то производится искл ИЛИ содержимого регистра контр суммы и полиномиального числа
}
else
{
reg_crc = reg_crc >> 1; //если младший бит = 0, искл ИЛИ не делается
}
}
}
return reg_crc; //регистр хранения конечного результата контр суммы
}
int main(void)
{
while (1)
{
asm(“nop”);
RCR = crc_chk(RX_modbus_rtu, 6); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке
}
}
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
#include <avr/io.h>
Unsigned char RX_modbus_rtu[15] = { 10, 1, 0, 6, 1, 28, 176 }; // 0A0100060001
Unsigned int RCR;
int crc_chk(unsigned char* data, unsigned char length)
{
register int j; // register - спецификатор, который предполагает, что доступ к объекту будет быстрым
register unsigned int reg_crc = 0xFFFF; //объявление 16-битного регистра
while (length--)
{
reg_crc ^= *data++; //каждый байт-исключение складывается по исключающему ИЛИ с текущим значением регистра контр суммы. После последнего 8 сдвига следующий байт складывается с текущей величиной регистра контр суммы и процесс сдвига повторяется повторно 8 раз
for (j = 0; j < 8; j++)
{
if (reg_crc & 0x01) //проверка младшего бита
{
reg_crc = (reg_crc >> 1) ^ 0xA001; //проверочный код на основе полинома. Результат всегда сдвигается в сторону младшего бита с заполнением нулем старшего бита. Если младший бит = 1, то производится искл ИЛИ содержимого регистра контр суммы и полиномиального числа
}
else
{
reg_crc = reg_crc >> 1; //если младший бит = 0, искл ИЛИ не делается
}
}
}
return reg_crc; //регистр хранения конечного результата контр суммы
}
int main(void)
{
while (1)
{
asm(“nop”);
RCR = crc_chk(RX_modbus_rtu, 6); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке
}
}