Вычислить арифметическую сумму для связи с машиной по последовательному - PullRequest
0 голосов
/ 06 января 2010

Я общаюсь с машиной по серийному номеру. Часть спецификации протокола связи гласит, что контрольная сумма представляет собой «арифметическую сумму байтов от <'PS'> (в комплекте), от <'data'> до <'CS'>"

Пакетные сообщения структурированы следующим образом:

<'PS'> <'data'> <'CS'>, где:

<'PS'> - Размер пакета

Длина: 1

Значение: от 0x02 до 0x63

Максимальная длина пакета составляет 99 байтов

<'данные'> - Данные

Длина: 1 ... 90 байтов

Значение: 0x00 - 0xFF

Длина части данных зависит от команды.

<'CS'> - контрольная сумма

Длина - 1 байт

Значение: 0x00 - 0xFF

* +1034 * Пример: * * одна тысяча тридцать пять

ACK Пакет: 0x02 0x01 0x03 , где 0x03 - контрольная сумма.

Так как мне вычислить контрольную сумму для этих байтов в C ++?

Ответы [ 2 ]

1 голос
/ 06 января 2010

Используйте 8-битный тип без знака (uint8_t или беззнаковый символ) в качестве аккумулятора, добавьте к нему каждый байт при генерации пакета и отправьте его в качестве байта контрольной суммы. Как именно зависит от того, как вы собираетесь создавать пакеты.

1 голос
/ 06 января 2010

Похоже, контрольная сумма - простая сумма, по модулю 256.

int sum = 0;
for (int j = 0;  j < number_of_bytes_in_message;  ++j)
   sum += message [j];

sum %= 256;  // or, if you prefer  sum &= 255;
...