подсчет crc буфера #14
Labels
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
Dependencies
No dependencies set.
Reference: ICS-Microprocessor-2020/Modbus_1_Deva4ki#14
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
#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); //принимает имя обрабатываемого массива и кол-во данных, участвующих в обработке
}
}