подсчет crc буфера #14

Closed
opened 2023-04-11 11:14:31 +00:00 by stud126792 · 1 comment
Owner
No description provided.
stud126792 self-assigned this 2023-04-11 11:14:31 +00:00
stud126792 added the due date 2023-04-11 2023-04-11 11:14:43 +00:00
Author
Owner

#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); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке
}
}

#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); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке } }
Sign in to join this conversation.
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

2023-04-11

Dependencies

No dependencies set.

Reference: ICS-Microprocessor-2020/Modbus_1_Deva4ki#14
No description provided.