![]() |
Контрольная сумма
И снова здравствуйте!
У меня вопрос по контрольной сумме в ответе. Есть связка GSM-модем Maestro-100, К-105 и ТЭКОН-19. Делаю успешные запросы с командой 11 и получаю ответы, но очень часто (где-то с частотой 50/50) они приходят с неправильной контрольной суммой, несмотря на правильную сигнатуру всего ответа. Например, такой ответ: Код:
68 06 06 68 01 01 47 44 20 40 6D 16 Тут же делаю такой же запрос и получаю уже абсолютно правильный ответ с правильной контрольной суммой: Код:
68 06 06 68 01 01 7B 32 2C 40 1B 16 Код:
unsigned char CS(const char* a) Добавлено через 13 минут Дополнение. Сейчас заметил ещё одну закономерность: ВСЕ ошибочные контрольные суммы отличаются ровно на 80h от правильной контрольной суммы! К чему бы это? Добавлено через 19 минут Дополнение. Получается, что контрольную сумму надо брать по модулю 128, а не 256? |
Re: Контрольная сумма
Везде заменил char на unsigned char - не помогло.
|
Re: Контрольная сумма
Как известно, передача всех чисел проходит младшими битами вперед, и у Вас проблемы возникают на самом последнем бите байта, если он отличен от нуля.
А если в других байтах ответа (например, в мантиссе) есть байты больше 0х80, они нормально проходят? Проверьте настройки всей связки, одинаковую скорость, одинаковость числа стоп-бит (один!). Попробуйте заменить модем. Проверьте свое ПО, вовремя ли оно читает последние два байта ответа. |
Re: Контрольная сумма
Решено.
Спасибо, gae, ваши замечания помогли. Действительно, модем присылал байты, которые ВСЕ были меньше 0x80! Видимо, я неправильно настроил COM-порт. И, видимо, COM-порт надо было перевести в неканонический режим. Это можно сделать одной командой cfmakeraw: Код:
termios attr = {0}; Код:
<< 10 41 01 11 04 01 04 5C 16 |
Текущее время: 08:01. Часовой пояс GMT +5. |
Powered by vBulletin® Version 3.6.1
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd. Перевод: zCarot