Dnia 16-02-2012 o 19:42:25 werbe <
kamil....@gmail.com> napisał(a):
> Witam,
>
> Czy ktoś mógłby mi pomóc i wskazać błąd. Poniżej przedstawiam dwie
> alternatywne metody liczące CRC 16 dla modbus: getCRC i getCRC_2.
> Ogólnie wartości CRC przez nie zwracana są OK, np: dla 0103044C005641
> dostaje 1333, dla 0103075C0002 dostaje 056D i są to wartości
> prawidłowe.
> Ale przykładowo dla 0103043E947AC0 dostaje w getCRC 2BF7, w getCRC_2
> 94B7 i nie są to wartości prawidłowe bo powinienem dostać: 9507.
Zmienne w Javie są signed.
private static int makeUnsigned(byte b)
{
return b < 0 ? b + 256 : b;
}
public static byte[] getCRC_2(byte[] values)
{
int crc = 0x0FFFF;
for (int i = 0; i < values.length; i++) {
int val = makeUnsigned(values[i]);
crc = (crc ^ val);
for (int n = 0; n < 8; n++) {
boolean lastbit = (crc & 0x01) != 0;
crc = (crc >> 1);
if (lastbit) {
crc = (crc ^ 0x0A001);
}
}
}
byte[] CRC = new byte[2];
CRC[0] = (byte)(crc & 0x0ff);
CRC[1] = (byte)((crc >> 8) & 0x0ff);
return CRC;
}
--
Boguś