Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2010, 18:41   #1
trysoff
 
Регистрация: 26.03.2010
Сообщений: 8
Вопрос Товарищи нужно разгадать контрольную сумму

Товарищи помогите разгадать контрольную сумму(в пакете данных она после «/»).
Эту контрольную сумму генерирует программка написанная в 1985г в США.
Нужна она для управления телемеханикой через RS-232C. Ниже расположены блоки данных которые передаются в КОМ порт, это записанный лог с ком-порта.
В первой части строки в HEX-e во второй ANSI.
Принимающая микросхема на другой стороне РС-232-го это Z80-SIO.
Структура пакета данных для примера ..0A01R21280D/5F:
0A01-адрес устройства
R-функция чтения из памяти (возможны и другие функции W,S,Z)
2128-адрес ячейки памяти с которой начать читать
0D-кол-во ячеек которые надо прочитать
/5F-контрольная сумма пакета данных-Вот метод расчета этой СУММЫ я и не могу разгодать ПОМОГИТЕ СВЕТЛЫЕ ГОЛОВЫ.

0A 0D 30 41 30 31 52 32 31 32 38 30 44 2F 35 46 ..0A01R21280D/5F
0A 0D 30 41 30 32 52 32 31 32 38 30 44 2F 35 43 ..0A02R21280D/5C
0A 0D 30 41 30 33 52 32 31 32 38 30 44 2F 35 44 ..0A03R21280D/5D
0A 0D 30 41 30 34 52 32 31 32 38 30 44 2F 35 41 ..0A04R21280D/5A
0A 0D 30 41 30 35 52 32 31 32 38 30 44 2F 35 42 ..0A05R21280D/5B
0A 0D 30 41 30 36 52 32 31 32 38 30 44 2F 35 38 ..0A06R21280D/58
0A 0D 30 41 30 37 52 32 31 32 38 30 44 2F 35 39 ..0A07R21280D/59
0A 0D 30 41 30 38 52 32 31 32 38 30 44 2F 35 36 ..0A08R21280D/56
0A 0D 30 41 30 39 52 32 31 32 38 30 44 2F 35 37 ..0A09R21280D/57
0A 0D 30 41 30 41 52 32 31 32 38 30 44 2F 32 46 ..0A0AR21280D/2F
0A 0D 30 41 30 42 52 32 31 32 38 30 44 2F 32 43 ..0A0BR21280D/2C
0A 0D 30 41 30 43 52 32 31 32 38 30 44 2F 32 44 ..0A0CR21280D/2D
0A 0D 30 41 30 44 52 32 31 32 38 30 44 2F 32 41 ..0A0DR21280D/2A
0A 0D 30 41 30 45 52 32 31 32 38 30 44 2F 32 42 ..0A0ER21280D/2B
0A 0D 30 41 30 46 52 32 31 32 38 30 44 2F 32 38 ..0A0FR21280D/28


0A 0D 31 32 33 34 52 32 31 32 38 30 44 2F 32 42 ..1234R21280D/2B
0A 0D 31 32 33 34 53 35 36 37 38 39 41 2F 32 33 ..1234S56789A/23
0A 0D 31 32 33 34 52 32 31 32 38 30 44 2F 32 42 ..1234R21280D/2B
0A 0D 31 32 33 34 53 35 36 37 38 39 42 2F 32 30 ..1234S56789B/20
0A 0D 31 32 33 34 53 35 36 37 38 39 43 2F 32 31 ..1234S56789C/21
0A 0D 31 32 33 34 53 35 36 37 39 39 41 2F 32 32 ..1234S56799A/22
0A 0D 31 32 33 34 53 35 36 37 41 39 41 2F 35 41 ..1234S567A9A/5A



0A 0D 31 32 33 34 52 35 36 37 38 39 41 2F 32 32 ..1234R56789A/22
0A 0D 31 32 33 34 53 35 36 37 38 39 41 2F 32 33 ..1234S56789A/23
0A 0D 31 32 33 34 5A 35 36 37 38 39 41 2F 32 41 ..1234Z56789A/2A
0A 0D 31 32 33 34 57 35 36 37 38 39 41 2F 32 37 ..1234W56789A/27

Если поможет то я дисассемблировал оригинальную программку .asm файл прилагаю
(Дисассемблер – IDA52)
P.S. Очень прошу, помочь бьюсь не первый месяц. Заранее СПАСИБО.
Вложения
Тип файла: txt TS56.asm.txt (915.1 Кб, 17 просмотров)
trysoff вне форума Ответить с цитированием
Старый 23.08.2010, 20:09   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Похоже CRC считается так:

Код:
function GetCRC(S:String):String;
var i, j:integer;
    c:byte;
begin
   c := 0;
   for i := 1 to length(S) do begin
      c := c xor ord(S[i]);
      for j := 0 to 7 do begin
         if c and $80 = $80
         then c := (c shl 1) xor 1
         else c := (c shl 1);
      end;
   end;
   result := IntToHex(c, 4);
end;

 writeln(GetCRC('0A01R21280D'));   //5F
по крайней мере на приведенных значениях работает
alexBlack вне форума Ответить с цитированием
Старый 23.08.2010, 20:19   #3
trysoff
 
Регистрация: 26.03.2010
Сообщений: 8
По умолчанию огромное спасибо!!!

Пожалуйста дайте пример на Си то в Бейсике не шарю
trysoff вне форума Ответить с цитированием
Старый 23.08.2010, 20:25   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от trysoff Посмотреть сообщение
Пожалуйста дайте пример на Си то в Бейсике не шарю
Код:
unsigned char Crc8(unsigned char *pcBlock, unsigned int len)
{
    unsigned char crc = 0;
    unsigned int i;
 
    while (len--)
    {
        crc ^= *pcBlock++;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 1 : crc << 1;
    }
 
    return crc;
}
В общем-то это стандартное вычисление CRC-8 изменено только начальное значение и вид полинома.
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно посчитать сумму ряда. В программе ошибка. Пожалуйста помогите найти Рита Белова Помощь студентам 5 05.12.2009 13:07
Помогите, пожлуйста, разгадать прогу. Filatov14 Софт 9 30.10.2009 20:57
Несчитает контрольную сумму напряжения PamPam Паскаль, Turbo Pascal, PascalABC.NET 2 28.12.2008 12:33