[uquote="smacorp",url="/forum/viewtopic.php?p=4741760#p4741760"]
HardWareMan, спорим теперь Вам придётся ещё написать и программку, чтобы она нужные команды ТС по найденному алгоритму паковала и в хитрый аппарат отправляла?[/uquote]
скажите , а вот обязательно . что " доброе" вставлять , из своей головы.
вам кажется без этой умной мысли, задача ну никак не решиться.
мелковата наверно провакация для HardWareMan.
он оказался ВЫШЕ вашего понимания действительности.
... существуют конечно и " джон неуловимый " и " бесценные мысли"
Добавлено after 14 minutes 19 seconds:
[uquote="HardWareMan",url="/forum/viewtopic.php?p=4741784#p4741784"]Алгоритм расчёта контрольной суммы заголовка прост: берём FF и вычитаем побайтно SOF, EP и SIZE. Расчёт контрольной суммы блока данных производится по такому алгоритму (писал на память, не компилировал, могут быть синтаксические ошибки):
Код: Выделить всё
uint16_t DoCheckSum( uint8_t *Buf, uint16_t Size )
{ // Локальные переменные
uint16_t Cnt,Sum,Tmp1,Tmp2;
// Инит
Sum = 0; Tmp1 = 0; Tmp2 = 0;
// Если размер больше 0
if (Size > 0)
{ // Цикл расчёта
Cnt = 0;
while (Cnt < Size)
{ // Tmp1
Tmp1 += *(Buf); if (Tmp1 > 0x00FE) { Tmp1 += 0xFF01; }
// Sum
Sum += Tmp1; if (Sum > 0x00FE) { Sum += 0xFF01; }
// Следующий байт
Buf++; Cnt++;
}
// Финализация
Tmp2 = Tmp1 + Sum; if (Tmp2 > 0x00FE) { Tmp2 += 0xFF01; }
Tmp2 ^= 0x00FF;
Tmp1 += Tmp2; if (Tmp1 > 0x00FE) { Tmp1 += 0xFF01; }
Tmp1 ^= 0x00FF;
Sum = (Tmp1 & 0x00FF) | ((Tmp2 << 8) & 0xFF00);
}
// Результат
return Sum;
}
Ну и немного пошаговых примеров под спойлером, в том числе и коллизионные, для интересующихся почему так происходит.
Спойлер
Коллизионные пакеты:
Код: Выделить всё
Пакет:
1B 02 80 : 62 [FF 03 00 C0] : C9 72
Заголовок:
1B > HSUM: FF - 1B = E4
02 > HSUM: E4 - 02 = E2
80 > HSUM: E2 - 80 = 62
62 > HSUM: ==========^^
Данные:
FF > TMP1: 0000 + 00FF = 00FF (00FF > 00FE) ? 00FF + FF01 = 0000
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
03 > TMP1: 0000 + 0003 = 0003 (0003 > 00FE) ?
SUM: 0000 + 0003 = 0003 (0003 > 00FE) ?
00 > TMP1: 0003 + 0000 = 0003 (0003 > 00FE) ?
SUM: 0003 + 0003 = 0006 (0006 > 00FE) ?
C0 > TMP1: 0003 + 00C0 = 00C3 (00C3 > 00FE) ?
SUM: 0006 + 00C3 = 00C9 (00C9 > 00FE) ?
Финализация:
TMP2: 00C3 + 00C9 = 018C (018C > 00FE) ? 018C + FF01 = 008D
008D ^ 00FF = 0072
TMP1: 0072 + 00C3 = 0135 (0135 > 00FE) ? 0135 + FF01 = 0036
0036 ^ 00FF = 00C9
SUM: (00C9 & 00FF) | ((0072 << 8) & FF00) = 72C9
Результат:
CRC: C9 72 == SUM: C9 72
Пакет:
1B 02 80 : 62 [00 03 00 C0] : C9 72
Заголовок:
1B > HSUM: FF - 1B = E4
02 > HSUM: E4 - 02 = E2
80 > HSUM: E2 - 80 = 62
62 > HSUM: ==========^^
Данные:
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
03 > TMP1: 0000 + 0003 = 0003 (0003 > 00FE) ?
SUM: 0000 + 0003 = 0003 (0003 > 00FE) ?
00 > TMP1: 0003 + 0000 = 0003 (0003 > 00FE) ?
SUM: 0003 + 0003 = 0006 (0006 > 00FE) ?
C0 > TMP1: 0003 + 00C0 = 00C3 (00C3 > 00FE) ?
SUM: 0006 + 00C3 = 00C9 (00C9 > 00FE) ?
Финализация:
TMP2: 00C3 + 00C9 = 018C (018C > 00FE) ? 018C + FF01 = 008D
008D ^ 00FF = 0072
TMP1: 0072 + 00C3 = 0135 (0135 > 00FE) ? 0135 + FF01 = 0036
0036 ^ 00FF = 00C9
SUM: (00C9 & 00FF) | ((0072 << 8) & FF00) = 72C9
Результат:
CRC: C9 72 == SUM: C9 72
Ещё коллизионные пакеты:
Код: Выделить всё
Пакет:
1B 02 04 : DE [FF 00 00 C0] : C0 7E
Заголовок:
1B > HSUM: FF - 1B = E4
02 > HSUM: E4 - 02 = E2
04 > HSUM: E2 - 04 = DE
DE > HSUM: ==========^^
Данные:
FF > TMP1: 0000 + 00FF = 00FF (00FF > 00FE) ? 00FF + FF01 = 0000
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
C0 > TMP1: 0000 + 00C0 = 00C0 (00C0 > 00FE) ?
SUM: 0000 + 00C0 = 00C0 (00C0 > 00FE) ?
Финализация:
TMP2: 00C0 + 00C0 = 0180 (0180 > 00FE) ? 0180 + FF01 = 0081
0081 ^ 00FF = 007E
TMP1: 007E + 00C0 = 013E (013E > 00FE) ? 013E + FF01 = 003F
003F ^ 00FF = 00C0
SUM: (00C0 & 00FF) | ((007E << 8) & FF00) = 7EC0
Результат:
CRC: C0 7E == SUM: C0 7E
Пакет:
1B 02 04 : DE [00 00 00 C0] : C0 7E
Заголовок:
1B > HSUM: FF - 1B = E4
02 > HSUM: E4 - 02 = E2
04 > HSUM: E2 - 04 = DE
DE > HSUM: ==========^^
Данные:
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
00 > TMP1: 0000 + 0000 = 0000 (0000 > 00FE) ?
SUM: 0000 + 0000 = 0000 (0000 > 00FE) ?
C0 > TMP1: 0000 + 00C0 = 00C0 (00C0 > 00FE) ?
SUM: 0000 + 00C0 = 00C0 (00C0 > 00FE) ?
Финализация:
TMP2: 00C0 + 00C0 = 0180 (0180 > 00FE) ? 0180 + FF01 = 0081
0081 ^ 00FF = 007E
TMP1: 007E + 00C0 = 013E (013E > 00FE) ? 013E + FF01 = 003F
003F ^ 00FF = 00C0
SUM: (00C0 & 00FF) | ((007E << 8) & FF00) = 7EC0
Результат:
CRC: C0 7E == SUM: C0 7E
Длинный пакет:
Код: Выделить всё
Пакет:
1B 02 2D : B5 [21 00 00 69 A5 69 00 00 00 00 00 4C 04 00 00 4C 04 00 00 4B 06 00 00 00 01 FF FF 7F FE 00 00 00 01 FF FF 7F FE 00 00 00 02 FF FF 7F FE] : 68 8C
Заголовок:
1B > HSUM: FF - 1B = E4
02 > HSUM: E4 - 02 = E2
2D > HSUM: E2 - 2D = B5
B5 > HSUM: ==========^^
Данные:
21 > TMP1: 0000 + 0021 = 0021 (0021 > 00FE) ?
SUM: 0000 + 0021 = 0021 (0021 > 00FE) ?
00 > TMP1: 0021 + 0000 = 0021 (0021 > 00FE) ?
SUM: 0021 + 0021 = 0042 (0042 > 00FE) ?
00 > TMP1: 0021 + 0000 = 0021 (0021 > 00FE) ?
SUM: 0042 + 0021 = 0063 (0063 > 00FE) ?
69 > TMP1: 0021 + 0069 = 008A (008A > 00FE) ?
SUM: 0063 + 008A = 00ED (00ED > 00FE) ?
A5 > TMP1: 008A + 00A5 = 012F (012F > 00FE) ? 012F + FF01 = 0030
SUM: 00ED + 0030 = 011D (011D > 00FE) ? 011D + FF01 = 001E
69 > TMP1: 0030 + 0069 = 0099 (0099 > 00FE) ?
SUM: 001E + 0099 = 00B7 (00B7 > 00FE) ?
00 > TMP1: 0099 + 0000 = 0099 (0099 > 00FE) ?
SUM: 00B7 + 0099 = 0150 (0150 > 00FE) ? 0150 + FF01 = 0051
00 > TMP1: 0099 + 0000 = 0099 (0099 > 00FE) ?
SUM: 0051 + 0099 = 00EA (00EA > 00FE) ?
00 > TMP1: 0099 + 0000 = 0099 (0099 > 00FE) ?
SUM: 00EA + 0099 = 0183 (0183 > 00FE) ? 0183 + FF01 = 0084
00 > TMP1: 0099 + 0000 = 0099 (0099 > 00FE) ?
SUM: 0084 + 0099 = 011D (011D > 00FE) ? 011D + FF01 = 001E
00 > TMP1: 0099 + 0000 = 0099 (0099 > 00FE) ?
SUM: 001E + 0099 = 00B7 (00B7 > 00FE) ?
4C > TMP1: 0099 + 004C = 00E5 (00E5 > 00FE) ?
SUM: 00B7 + 00E5 = 019C (019C > 00FE) ? 019C + FF01 = 009D
04 > TMP1: 00E5 + 0004 = 00E9 (00E9 > 00FE) ?
SUM: 009D + 00E9 = 0186 (0186 > 00FE) ? 0186 + FF01 = 0087
00 > TMP1: 00E9 + 0000 = 00E9 (00E9 > 00FE) ?
SUM: 0087 + 00E9 = 0170 (0170 > 00FE) ? 0170 + FF01 = 0071
00 > TMP1: 00E9 + 0000 = 00E9 (00E9 > 00FE) ?
SUM: 0071 + 00E9 = 015A (015A > 00FE) ? 015A + FF01 = 005B
4C > TMP1: 00E9 + 004C = 0135 (0135 > 00FE) ? 0135 + FF01 = 0036
SUM: 005B + 0036 = 0091 (0091 > 00FE) ?
04 > TMP1: 0036 + 0004 = 003A (003A > 00FE) ?
SUM: 0091 + 003A = 00CB (00CB > 00FE) ?
00 > TMP1: 003A + 0000 = 003A (003A > 00FE) ?
SUM: 00CB + 003A = 0105 (0105 > 00FE) ? 0105 + FF01 = 0006
00 > TMP1: 003A + 0000 = 003A (003A > 00FE) ?
SUM: 0006 + 003A = 0040 (0040 > 00FE) ?
4B > TMP1: 003A + 004B = 0085 (0085 > 00FE) ?
SUM: 0040 + 0085 = 00C5 (00C5 > 00FE) ?
06 > TMP1: 0085 + 0006 = 008B (008B > 00FE) ?
SUM: 00C5 + 008B = 0150 (0150 > 00FE) ? 0150 + FF01 = 0051
00 > TMP1: 008B + 0000 = 008B (008B > 00FE) ?
SUM: 0051 + 008B = 00DC (00DC > 00FE) ?
00 > TMP1: 008B + 0000 = 008B (008B > 00FE) ?
SUM: 00DC + 008B = 0167 (0167 > 00FE) ? 0167 + FF01 = 0068
00 > TMP1: 008B + 0000 = 008B (008B > 00FE) ?
SUM: 0068 + 008B = 00F3 (00F3 > 00FE) ?
01 > TMP1: 008B + 0001 = 008C (008C > 00FE) ?
SUM: 00F3 + 008C = 017F (017F > 00FE) ? 017F + FF01 = 0080
FF > TMP1: 008C + 00FF = 018B (018B > 00FE) ? 018B + FF01 = 008C
SUM: 0080 + 008C = 010C (010C > 00FE) ? 010C + FF01 = 000D
FF > TMP1: 008C + 00FF = 018B (018B > 00FE) ? 018B + FF01 = 008C
SUM: 000D + 008C = 0099 (0099 > 00FE) ?
7F > TMP1: 008C + 007F = 010B (010B > 00FE) ? 010B + FF01 = 000C
SUM: 0099 + 000C = 00A5 (00A5 > 00FE) ?
FE > TMP1: 000C + 00FE = 010A (010A > 00FE) ? 010A + FF01 = 000B
SUM: 00A5 + 000B = 00B0 (00B0 > 00FE) ?
00 > TMP1: 000B + 0000 = 000B (000B > 00FE) ?
SUM: 00B0 + 000B = 00BB (00BB > 00FE) ?
00 > TMP1: 000B + 0000 = 000B (000B > 00FE) ?
SUM: 00BB + 000B = 00C6 (00C6 > 00FE) ?
00 > TMP1: 000B + 0000 = 000B (000B > 00FE) ?
SUM: 00C6 + 000B = 00D1 (00D1 > 00FE) ?
01 > TMP1: 000B + 0001 = 000C (000C > 00FE) ?
SUM: 00D1 + 000C = 00DD (00DD > 00FE) ?
FF > TMP1: 000C + 00FF = 010B (010B > 00FE) ? 010B + FF01 = 000C
SUM: 00DD + 000C = 00E9 (00E9 > 00FE) ?
FF > TMP1: 000C + 00FF = 010B (010B > 00FE) ? 010B + FF01 = 000C
SUM: 00E9 + 000C = 00F5 (00F5 > 00FE) ?
7F > TMP1: 000C + 007F = 008B (008B > 00FE) ?
SUM: 00F5 + 008B = 0180 (0180 > 00FE) ? 0180 + FF01 = 0081
FE > TMP1: 008B + 00FE = 0189 (0189 > 00FE) ? 0189 + FF01 = 008A
SUM: 0081 + 008A = 010B (010B > 00FE) ? 010B + FF01 = 000C
00 > TMP1: 008A + 0000 = 008A (008A > 00FE) ?
SUM: 000C + 008A = 0096 (0096 > 00FE) ?
00 > TMP1: 008A + 0000 = 008A (008A > 00FE) ?
SUM: 0096 + 008A = 0120 (0120 > 00FE) ? 0120 + FF01 = 0021
00 > TMP1: 008A + 0000 = 008A (008A > 00FE) ?
SUM: 0021 + 008A = 00AB (00AB > 00FE) ?
02 > TMP1: 008A + 0002 = 008C (008C > 00FE) ?
SUM: 00AB + 008C = 0137 (0137 > 00FE) ? 0137 + FF01 = 0038
FF > TMP1: 008C + 00FF = 018B (018B > 00FE) ? 018B + FF01 = 008C
SUM: 0038 + 008C = 00C4 (00C4 > 00FE) ?
FF > TMP1: 008C + 00FF = 018B (018B > 00FE) ? 018B + FF01 = 008C
SUM: 00C4 + 008C = 0150 (0150 > 00FE) ? 0150 + FF01 = 0051
7F > TMP1: 008C + 007F = 010B (010B > 00FE) ? 010B + FF01 = 000C
SUM: 0051 + 000C = 005D (005D > 00FE) ?
FE > TMP1: 000C + 00FE = 010A (010A > 00FE) ? 010A + FF01 = 000B
SUM: 005D + 000B = 0068 (0068 > 00FE) ?
Финализация:
TMP2: 000B + 0068 = 0073 (0073 > 00FE) ?
0073 ^ 00FF = 008C
TMP1: 008C + 000B = 0097 (0097 > 00FE) ?
0097 ^ 00FF = 0068
SUM: (0068 & 00FF) | ((008C << 8) & FF00) = 8C68
Результат:
CRC: 68 8C == SUM: 68 8C
[/uquote]
ОК. спасибо.
буду пробовать и тренироваться.
"тернист путь создателя к звездам ,
Через усилие к победе, Через трудности к триумфу,
особенно мешает грязь завистников и мелкие покусывания , от недостатка имеющихся знаний в багаже.