Задать вопрос

Контрольная сумма С#?

Прошу помощи в решении уже замучившего меня вопроса, с подсчетом контрольной суммы пакета. Работаю не программистом, но помогаю решать некоторые вопросы связанные с работой отдела.

В общем проблема в следующем, есть прибор отечественной разработки

Обратился я к ним за сопроводительной документацией, но мои знания не помогли разобраться в вопросе формирования контрольной суммы пакета, если на стадии приема я еще могу как то обойти эту сторону , то в случае записи параметров в устройство мне без этого не куда.

Программу закончил остался один не решенный вопрос с установкой сканируемой частоты, к сожалению без этого не куда.

Прослушал я программу которая идет в комплекте с прибором, и что я получил:

Есть массив байт mass1, пакет содержит информацию которая записывается в прибор:

byte[] mass1 = new byte[]{75,0,25,0,3,88,2,0,126,37,0,188,138,169,53,66,15,52,115,203,112,103,220,16,92,237,76,80,254};


В конце пакета дописываются 2 байта, что представляет из себя контрольную сумму этого пакета mass2:

byte[] mass2 = new byte[]{241,9};

Полное сообщение записываемое в прибор, должно иметь вид полный пакет имеет вид mass3:

byte[] mass3 = new byte[]{75,0,25,0,3,88,2,0,126,37,0,188,138,169,53,66,15,52,115,203,112,103,220,16,92,237,76,80,254,241,9};


Приведенный выше пакет mass3, производит установку значений в прибор. В документации про него не чего не сказано.

Так же я прослушал пакет который присылает прибор с уже имеющимися в нем установками, так скажем идентификационный mass4:
byte[] mass4 = new byte[] { 0x40, 0x00, 0x03, 0x58, 0x02, 0x00, 0x7E, 0x25, 0x00, 0xBC, 0x8A, 0xA9, 0x35, 0x42, 0x0F, 0x34, 0x73, 0xCB, 0x70, 0x67, 0xDC, 0x10, 0x5C, 0xED, 0x4C, 0x50, 0xFE, 0x00, 0x45, 0x29, 0x51, 0x09, 0x11, 0x03, 0x28, 0x30, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x16, 0x20, 0x50, 0x33, 0x34, 0x31, 0x2D, 0x34, 0x32, 0x36, 0x00, 0x32, 0x36, 0x2E, 0x31, 0x30, 0x2E, 0x30, 0x36, 0x2D, 0x31, 0x33, 0x00, 0x06, 0x0F };


На него есть описание в документации, принцип тот же последние 2 байта пакета это контрольная сумма, все остальное информационная часть.

Помогите пожалуйста решить вопрос с написанием кода подсчета контрольной суммы, в любом виде главное что бы в возвращаемом значении присутствовала верная контрольная сумма. Я просто уже не понимаю что я делаю не так, CRC-16 побывал, но желаемого результата не получил.

Если кто то решится помочь, для проверки пакеты mass аналогичны mass3, только с измененными параметрами для записи в прибор, последние 2 байта контрольная сумма:

byte[] mass = new byte[]{75,0,25,0,3,48,117,0,126,37,0,188,138,169,53,66,15,52,115,203,112,103,220,16,92,237,76,80,254,60,10};
byte[] mass = new byte[]{75,0,25,0,3,64,156,0,126,37,0,188,138,169,245,165,14,52,115,203,96,64,220,16,92,237,76,80,254,94,11};
byte[] mass = new byte[]{75,0,25,0,3,80,195,0,126,37,0,88,138,169,181,9,14,52,115,203,120,60,220,32,131,237,236,214,255,199,11};
byte[] mass = new byte[]{75,0,25,0,3,112,17,1,126,37,0,88,138,169,181,9,14,52,115,203,120,60,220,32,131,237,236,214,255,54,11};
byte[] mass = new byte[]{75,0,25,0,3,60,134,1,126,37,0,88,138,169,181,9,14,52,115,203,120,60,220,32,131,237,236,214,255,119,11};


Документация, которую мне прислал завод изготовитель
e8824a0ebb8f464eba2b86085818d278.jpg
На картинке ниже формат пакета mass4, чтение установок прибора:
4d47b69db4734bd6886954de2e20caeb.jpg13ce8b5dba5843dfb95e9303d1b4a4a0.jpgf3ac11224e764c97aafef93c87f9f90c.jpg2ab86287cbcb46618b47c09be5f9afcf.jpg8e80d5b8cd2043dc8c6be5c0df4400fb.jpg7d6b98787e594ea583059a2abdc3bf74.jpg
  • Вопрос задан
  • 1189 просмотров
Подписаться 3 Оценить 5 комментариев
Решения вопроса 1
@none7
Для первого набора байт подходит такой простой код:
static byte[] crc(byte[] data) {
    ushort sum = 0;
    foreach (byte b in data)
        sum += b;
    return new byte[] {(byte)(sum & 255), (byte)(sum >> 8)};
}

Те есть сумма всех байтов сообщения включая код операции и длину сообщения, но без чексуммы. То есть в документации косяк чексумма считается с 0 по 4+n без -1, n длина данных для команды. Но там ведь сказано, что чексумма это «сумма байтов пакета».

А вот собственно и полный тест:
static ushort crc(byte[] data, ushort sum = 0) {
    foreach (byte b in data) sum += b;
    return sum;
}
static void Main(string[] args)
{
    // пакеты без чексумм
    byte[] mass1 = new byte[] { 75, 0, 25, 0, 3, 48, 117, 0, 126, 37, 0, 188, 138, 169, 53, 66, 15, 52, 115, 203, 112, 103, 220, 16, 92, 237, 76, 80, 254};
    byte[] mass2 = new byte[] { 75, 0, 25, 0, 3, 64, 156, 0, 126, 37, 0, 188, 138, 169, 245, 165, 14, 52, 115, 203, 96, 64, 220, 16, 92, 237, 76, 80, 254};
    byte[] mass3 = new byte[] { 75, 0, 25, 0, 3, 80, 195, 0, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
    byte[] mass4 = new byte[] { 75, 0, 25, 0, 3, 112, 17, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};
    byte[] mass5 = new byte[] { 75, 0, 25, 0, 3, 60, 134, 1, 126, 37, 0, 88, 138, 169, 181, 9, 14, 52, 115, 203, 120, 60, 220, 32, 131, 237, 236, 214, 255};

    foreach(var mass in new byte[][] {mass1, mass2, mass3, mass4, mass5}) {
        bool first = true;
        Console.Write("{");
        foreach (var b in mass)  {
            if (!first) Console.Write(", ");
            else first = false;

            Console.Write(b);
        }
        var sum = BitConverter.GetBytes(crc(mass));
        // вывод чексуммы
        Console.WriteLine(", {0}, {1}}}", sum[0], sum[1]);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы