anselm
11.11.2013, 10:30
И снова здравствуйте!
У меня вопрос по контрольной сумме в ответе.
Есть связка GSM-модем Maestro-100, К-105 и ТЭКОН-19. Делаю успешные запросы с командой 11 и получаю ответы, но очень часто (где-то с частотой 50/50) они приходят с неправильной контрольной суммой, несмотря на правильную сигнатуру всего ответа. Например, такой ответ:
68 06 06 68 01 01 47 44 20 40 6D 16
Всё здесь правильно, включая пришедшее число float = 2.504167 - а вот контрольная сумма неправильная 6D, тогда как должна быть ED.
Тут же делаю такой же запрос и получаю уже абсолютно правильный ответ с правильной контрольной суммой:
68 06 06 68 01 01 7B 32 2C 40 1B 16
Контрольную сумму для данного ответа считаю по такому алгоритму:
unsigned char CS(const char* a)
{
unsigned char b = 0;
for(int i=4; i<10; i++) {
b = (b + a) % 256;
}
return b;
}
Подскажите пожалуйста, где тут кроется ошибка?
[I]Добавлено через 13 минут
Дополнение.
Сейчас заметил ещё одну закономерность: ВСЕ ошибочные контрольные суммы отличаются ровно на 80h от правильной контрольной суммы!
К чему бы это?
Добавлено через 19 минут
Дополнение.
Получается, что контрольную сумму надо брать по модулю 128, а не 256?
У меня вопрос по контрольной сумме в ответе.
Есть связка GSM-модем Maestro-100, К-105 и ТЭКОН-19. Делаю успешные запросы с командой 11 и получаю ответы, но очень часто (где-то с частотой 50/50) они приходят с неправильной контрольной суммой, несмотря на правильную сигнатуру всего ответа. Например, такой ответ:
68 06 06 68 01 01 47 44 20 40 6D 16
Всё здесь правильно, включая пришедшее число float = 2.504167 - а вот контрольная сумма неправильная 6D, тогда как должна быть ED.
Тут же делаю такой же запрос и получаю уже абсолютно правильный ответ с правильной контрольной суммой:
68 06 06 68 01 01 7B 32 2C 40 1B 16
Контрольную сумму для данного ответа считаю по такому алгоритму:
unsigned char CS(const char* a)
{
unsigned char b = 0;
for(int i=4; i<10; i++) {
b = (b + a) % 256;
}
return b;
}
Подскажите пожалуйста, где тут кроется ошибка?
[I]Добавлено через 13 минут
Дополнение.
Сейчас заметил ещё одну закономерность: ВСЕ ошибочные контрольные суммы отличаются ровно на 80h от правильной контрольной суммы!
К чему бы это?
Добавлено через 19 минут
Дополнение.
Получается, что контрольную сумму надо брать по модулю 128, а не 256?