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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2023, 15:29   #1
aha
Пользователь
 
Регистрация: 17.04.2010
Сообщений: 29
По умолчанию назад в прошлое , вопрос по CRC кодам

когда то в каких то приборах использовал подсчет CRC, для связи по модбасу rtu
точно знаю такую комбинацию дивайс понимает 7 10 0 8 0 1 2 0 2 0D 79
0D 79 это CRC должно 16
подставляю в прежнюю формулу подсчета 0D 79 никак не получается ....
пытался в калькуляторы онлайн вставлять тоже не могу получить ожидаемое
aha вне форума Ответить с цитированием
Старый 27.06.2023, 15:41   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Первая ссылка в гугле https://www.lammertbies.nl/comm/info/crc-calculation
вставляете 071000080001020002 тыкаете hex и Calculate CRC -> CRC-16 (Modbus) 0x790D
p51x вне форума Ответить с цитированием
Старый 27.06.2023, 15:45   #3
aha
Пользователь
 
Регистрация: 17.04.2010
Сообщений: 29
По умолчанию

спасибо что напомнили , похоже я ранее подсчет проводил CRC -16 не модбас , как сложно переделать такое ? алгоритм насколько сложнее ?
aha вне форума Ответить с цитированием
Старый 27.06.2023, 16:05   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Что переделать? Там алгоритма то:
Код:
UInt16 ModRTU_CRC(byte[] buf, int len)
{
  UInt16 crc = 0xFFFF;
  
  for (int pos = 0; pos < len; pos++) {
    crc ^= (UInt16)buf[pos];          // XOR byte into least sig. byte of crc
  
    for (int i = 8; i != 0; i--) {    // Loop over each bit
      if ((crc & 0x0001) != 0) {      // If the LSB is set
        crc >>= 1;                    // Shift right and XOR 0xA001
        crc ^= 0xA001;
      }
      else                            // Else LSB is not set
        crc >>= 1;                    // Just shift right
    }
  }
  // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
  return crc;  
}
p51x вне форума Ответить с цитированием
Старый 27.06.2023, 16:16   #5
aha
Пользователь
 
Регистрация: 17.04.2010
Сообщений: 29
По умолчанию

function crc16(Buffer: string; Polynom, Initial: Cardinal): Cardinal;
var
i, j: Integer;
begin
Result := Initial;
for i := 1 to Length(Buffer) do
begin
// f1.sb2.Tag:= f1.sb2.Tag+1; //256
Result := Result xor (ord(buffer[i]) shl 8);
for j := 0 to 7 do
begin
// f1.tag:=f1.tag+1;
if (Result and $8000) <> 0 then
Result := (Result shl 1) xor Polynom
else
Result := Result shl 1;
end;
end;
Result:=Result and $ffff;
end;

function GenerateTableCrc16(Poly: Cardinal): Cardinal;
var
i: Cardinal;
begin
for i:=0 to 255 do
begin
CRC16Table[i] := Crc16(chr(i),Poly,0); // ..256

end;

end;

GenerateTableCrc16($8F57);
e12.text:=inttohex(crc16byte(s,0),4 ); ТУТ Я ПОЛУЧАЛ crc

мне конечно помогли- тот дивайс работал

Последний раз редактировалось aha; 27.06.2023 в 16:21.
aha вне форума Ответить с цитированием
Старый 28.06.2023, 15:51   #6
aha
Пользователь
 
Регистрация: 17.04.2010
Сообщений: 29
По умолчанию

разобрался с кодом, теперь не могу прочитать полученные 3 байта с прибора
00 41 40 это точно 12
00 41 50 -- 13
.
.
00 41 А0 -- 20

00 43 00 -- 128
не хотелось бы составлять таблицу перевода ...
aha вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вспомним прошлое!!!! SG13 Свободное общение 52 20.11.2011 17:21
Вопрос по RGB-кодам цветов, оттенки и различия. Vova777 Общие вопросы Delphi 3 06.10.2011 20:13
Вопрос по кодам Хаффмана BaSoff Общие вопросы C/C++ 5 29.03.2010 00:42
Назад в прошлое Repz О форуме и сайтах клуба 4 14.08.2007 12:56