Вернуться   Форум КРЕЙТ > Вопросы > Интерфейсы, построение сетей

Интерфейсы, построение сетей Объединение котроллеров в сети для сбора и обработки информации

Закрытая тема
 
Опции темы Опции просмотра
Старый 11.11.2013, 10:30   #1
anselm
Новичок
 
Аватар для anselm
 
Адрес: Челябинск
Сообщений: 9
По умолчанию Контрольная сумма

И снова здравствуйте!
У меня вопрос по контрольной сумме в ответе.
Есть связка 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[i]) % 256;
  }
  return b;
}
Подскажите пожалуйста, где тут кроется ошибка?

Добавлено через 13 минут

Дополнение.
Сейчас заметил ещё одну закономерность: ВСЕ ошибочные контрольные суммы отличаются ровно на 80h от правильной контрольной суммы!
К чему бы это?

Добавлено через 19 минут

Дополнение.
Получается, что контрольную сумму надо брать по модулю 128, а не 256?
anselm вне форума  
Старый 11.11.2013, 12:23   #2
anselm
Новичок
 
Аватар для anselm
 
Адрес: Челябинск
Сообщений: 9
По умолчанию Re: Контрольная сумма

Везде заменил char на unsigned char - не помогло.
anselm вне форума  
Старый 11.11.2013, 13:02   #3
gae
Ветеран КРЕЙТ
 
Аватар для gae
 
Адрес: Россия, Екатеринбург
Сообщений: 148
По умолчанию Re: Контрольная сумма

Как известно, передача всех чисел проходит младшими битами вперед, и у Вас проблемы возникают на самом последнем бите байта, если он отличен от нуля.
А если в других байтах ответа (например, в мантиссе) есть байты больше 0х80, они нормально проходят?
Проверьте настройки всей связки, одинаковую скорость, одинаковость числа стоп-бит (один!). Попробуйте заменить модем.
Проверьте свое ПО, вовремя ли оно читает последние два байта ответа.
gae вне форума  
Старый 12.11.2013, 11:56   #4
anselm
Новичок
 
Аватар для anselm
 
Адрес: Челябинск
Сообщений: 9
По умолчанию Re: Контрольная сумма

Решено.
Спасибо, gae, ваши замечания помогли. Действительно, модем присылал байты, которые ВСЕ были меньше 0x80! Видимо, я неправильно настроил COM-порт. И, видимо, COM-порт надо было перевести в неканонический режим. Это можно сделать одной командой cfmakeraw:
Код:
termios attr = {0};
cfmakeraw(&attr);
cfsetispeed(&attr, B9600);
cfsetospeed(&attr, B9600);
Теперь ответ выглядит красиво и контрольная сумма не врёт:
Код:
<< 10 41 01 11 04 01 04 5C 16
>> 68 06 06 68 01 01 74 79 9C 40 CB 16
Чему я очень рад!
anselm вне форума  
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контроллер К-104 Незарегистрированный Интерфейсы, построение сетей 26 12.12.2012 22:30
Электрическая принципиальная схема ТЭКОН 17 vita20 Документация 3 25.01.2010 15:25
Отрицательная квитанция 5ova Программное Обеспечение 4 27.12.2007 17:01


Текущее время: 23:09. Часовой пояс GMT +5.


Powered by vBulletin® Version 2.x.x
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Время генерации страницы 0.06740 секунды с 10 запросами