unsigned char crc = 0xff; //пробовал crc = 0;
char c[2];
unsigned int i;
for(int i = 0; i <strlen(cmd);++i)
crc ^= cmd;
sprintf(c,"%02X", crc);
кс по модулю два.
В доках к девайсу,следущая инструкция:
Для подсчета контрольной суммы, суммируют по модулю два, двоичные
представления символов команды, начиная с маркера и до последнего символа, параметра команды dm. Полученный в результате двоичный байт разбивают на две тетрады, каждую из которых представляют в виде ASCII-символа [‘0’…’9’,’A’…’F’].
cmd ="#64700000R";
Расчет произвожу следующим образом
Код:
пробовал так:
Код:
unsigned char crc = 0xff; // и 0;
unsigned int i;
while (len--)
{
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
unsigned int i;
while (len--)
{
crc ^= *pcBlock++;
for (i = 0; i < 8; i++)
crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
}
Подскажите правильный алгоритм расчета CRC по модулю 2.
Должно получится так "#64700000R06".
Цитата: rookie
Должно получится так "#64700000R06".
А это к чему вообще? Как понимать?
строка без crc #64700000R (1 маркер, 2-4 адрес, 5-9 пароль, 10 - команда),
строка с crc #64700000R06.
Собственно вопрос, как по выше изложенной инструкции, вычислить правильно crc.
Есть программа, которая общается с девайсом, она дает такой результат #64700000R06.
Если посчитать традиционно, то получается именно 06:
Код:
void main()
{
char *cmd ="#64700000R";
char crc = cmd[0];
for (int i=1; i<strlen(cmd); ++i)
crc += cmd;
printf("%02x\n", crc); // выведет 06
}
{
char *cmd ="#64700000R";
char crc = cmd[0];
for (int i=1; i<strlen(cmd); ++i)
crc += cmd;
printf("%02x\n", crc); // выведет 06
}