Исходника программы компа нет, но есть исходник (в icc) предыдущей версии рабочего устройства (правильно рассчитываеющего CRC и успешно обменивающегося с программой), из которого был взят фрагмент рассчёта CRC. По какой то причине CRC рассчитывается неверно.
Фрагмент для IAR:
Код
// пакет лежит в uart1_buffer
// len - длина пакета, по которому считается CRC (76 байт)
void CRC16(unsigned int len)
{ unsigned char i;
unsigned int k;
unsigned int CRC;
CRC=k=0;
while(k<len){
CRC=CRC^((unsigned int)uart1_buffer[k++]<<8);
i=8;
do{
if(CRC & 0x8000) CRC=(CRC<<1)^0x1021;
else CRC=CRC<<1;
} while(--i);
}
// дописываем в конец буфера CRC16
uart1_buffer[76]=CRC & 0xff;
uart1_buffer[77]=(CRC>>8) & 0xff;
}
// len - длина пакета, по которому считается CRC (76 байт)
void CRC16(unsigned int len)
{ unsigned char i;
unsigned int k;
unsigned int CRC;
CRC=k=0;
while(k<len){
CRC=CRC^((unsigned int)uart1_buffer[k++]<<8);
i=8;
do{
if(CRC & 0x8000) CRC=(CRC<<1)^0x1021;
else CRC=CRC<<1;
} while(--i);
}
// дописываем в конец буфера CRC16
uart1_buffer[76]=CRC & 0xff;
uart1_buffer[77]=(CRC>>8) & 0xff;
}
Для пакета
Код
0A 90 00 00 00 00 00 00 00 00 4F 33 40 40 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
CRC16 должна быть равна A1 01, а рассчитывается 0B D1, перепробовал ещё кучу стандартных алгоритмов, все рассчитывают новые CRC, но ни одна не посчитала A1 01. Голову сломал на этом затыке. Буду благодарен за любые мысли по проблеме