powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расчет контрольной суммы (RS-232)
25 сообщений из 27, страница 1 из 2
Расчет контрольной суммы (RS-232)
    #40023990
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
При изменении параметра прибора (устанавливаем число 20) читаю с порта (RS232) следующие данные
Код: pascal
1.
AA 02 01 00 02 01 14 F6 28


При установке числа 19 получаем такой ответ
Код: pascal
1.
AA 02 01 00 02 01 13 76 39


Так понял, что последние два байта - это контрольная сумма.
Подскажите, каким вычислением получается такая CRC? Пробовал использовать алгоритмы работы CRC16, но что-то не то получается.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40023993
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HadroranТак понял, что последние два байта - это контрольная сумма.

Спецификация протокола прибора позволит "знать", а не "понимать".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40023995
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

В том то и дело, что китайсы любезно видимо забыли его просто положить
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40023996
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чёрную коробочку без единой надписи снаружи они наглухо заварили?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40023998
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

И чёрную коробочку без единой надписи снаружи они наглухо заварили?..

ну реально нет инфы на эту хрень
RFID считыватель CL7206C
Продажники и те нихрена предоставить не могут... печалька
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024000
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hadroran,

а зачем тебе эта CRC?
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024003
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ъъъъъ
Hadroran,

а зачем тебе эта CRC?


Ну кроме 19 и 20 есть же и другие цыферки...
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024007
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran,

С тебя пиво.

Пальцем в небо, но:
https://crccalc.com/

02 01 00 02 01 14
CRC-16/BUYPASS 0xF628

02 01 00 02 01 13
CRC-16/BUYPASS 0x7639
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024010
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алгоритм тыкания пальцем в небо:

I. Смотрим ГОСТ Р исо/м эк 1 8 0 0 0 - 6 2 - 2014 видим слова CRC. Вроде топик стартер в чем-то прав.

II. Ищем онлайн CRC калькулятор, охреневаем от количества вариантов CRC )))

III.
1. Вбиваем циферки - видим хрень
2. По опыту ))), пытаемся переставить байты местами ( Big Endian, Low Endian ) - это не получается. А CRC все-же CRC 16 ))). Что наводит на мысль, что топик стартер в чем-то не прав )))
3. Добиваем 00 в конец - видим хрень
4. Убираем AA в начале - и печалимся... т.к. результат достигнут, а не булькает (((
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024022
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsev,

Спасибо, (бульк)
ща применим
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024036
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroranну реально нет инфы на эту хрень
RFID считыватель CL7206C

Правда? А у меня первая же ссылка в гугле - на мануал, где, помимо всего прочего,
говорится "support ISO18000-6C/6B protocols".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024038
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Hadroranну реально нет инфы на эту хрень
RFID считыватель CL7206C

Правда? А у меня первая же ссылка в гугле - на мануал, где, помимо всего прочего,
говорится "support ISO18000-6C/6B protocols".


стыжуся...
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024045
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

support ISO18000-6C/6B protocols

Вроде данный стандарт про радиоканал, а не про API между считывателем и компьютером. Т.ч. с точки зрения документации API, мало чего дает. IMHO
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024046
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что-то не получается.
Выдает данные вычислений по модбасу. Подскажите, где ошибка?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $FFFF;
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $A001;
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024047
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВроде данный стандарт про радиоканал, а не про API между считывателем и компьютером.

Может и так, но у меня опять же первая ссылка в гугле по "ISO18000-6C/6B protocols" ведёт
на "LinkSprite Long Distance RFID reader (ISO18000-6C EPC G2) Communication Protocol",
что, конечно, не та коробочка, но чиселки весьма похожи и самое ценное - процедура КС в
виде исходника.

PS: А, нет, присмотрелся - и в самом деле не та КС, процедура на один контрольный байт.
PPS: Зато на второй странице вот оно: https://stackoverflow.com/questions/149617/how-could-i-guess-a-checksum-algorithm

Hadroran
Подскажите, где ошибка?

Полиномиал у тебя не тот, см. ссылку выше.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024050
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Hadroran
Подскажите, где ошибка?

Полиномиал у тебя не тот, см. ссылку выше.

Кроме того вики говорит что начальное значение для BYPASS - 0.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024057
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ok. Исправляем для Bypass
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $0;  //   начальное значение для BYPASS
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;     
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $8005;  //   Полином
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;


Все одно - неверный результат...
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024062
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hadroran
Ok. Исправляем для Bypass
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
function GetCRC16_BYPASS(const HexData: string): UInt16;
var
  Buffer: Array of Byte;
  b:TArray<Byte>;
  CRC: UInt16;
  Mask: UInt16;
  I: Integer;
  J: Integer;
begin
  SetLength(Buffer, Length(HexData) div 2);
  HexToBin(PChar(HexData), Buffer, Length(Buffer));
  CRC := $0;  //   начальное значение для BYPASS
  for I := Low(Buffer) to High(Buffer) do
    begin
      CRC := CRC xor Buffer[i];
      for J := 1 to 8 do
        begin
          Mask := 0;     
          if ((CRC / 2) <> (CRC div 2)) then
            begin
             Mask := $8005;  //   Полином
            end;
          CRC := (CRC div 2) and $7FFF;
          CRC := CRC xor Mask;
        end;
    end;
Result := ((CRC and $FF) shl 8) + (CRC shr 8);
end;



Все одно - неверный результат...

Я так понимаю, что ты просто отсюда код утащил
https://stackoverflow.com/questions/38529075/how-usuage-crc16-modbus-in-delphi
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024063
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,
Да тут этих кодов, как фантиков... не писать же все которые испробовал.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024068
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran,

На, алгоритм беззаботно спизаимствован отсюда :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
program crc16;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

type
  TCRC16Params = record
    Poly: Word;
    Init: Word;
    RefIn: Boolean;
    RefOut: Boolean;
    XorOut: Word;
    Check: Word;
    Name: string
  end;

  TCRC16 = class
  private
    FParams: TCRC16Params;
    FTable: array [Byte] of Word;
    FValue: PWord;
  protected
    procedure CheckInitialized;
    procedure UpdateLSB(Data: PByte; Count: Cardinal);
    procedure UpdateMSB(Data: PByte; Count: Cardinal);
  public
    constructor Create(const Params: TCRC16Params);
    function  CalcCRC16(Data: PByte; Count: Cardinal): Word;
    function  Complete: Word;
    procedure Initialize;
    procedure Update(Data: PByte; Count: Cardinal);
  end;

const
  CRC16BYPASS: TCrc16Params = (
    Poly: $8005;
    Init: $0000;
    RefIn: False;
    RefOut: False;
    XorOut: $0000;
    Check: $FEE8;
    Name: 'CRC-16/BUYPASS';
  );

{ TCRC16 }

function ReverseByte(b: Byte): Byte;
begin
  b := (b and $F0) shr 4 or (b and $0F) shl 4;
  b := (b and $CC) shr 2 or (b and $33) shl 2;
  Result := (b and $AA) shr 1 or (b and $55) shl 1;
end;

function ReverseWord(w: Word): Word;
begin
  w := (w and $FF00) shr 8 or (w and $00FF) shl 8;
  w := (w and $F0F0) shr 4 or (w and $0F0F) shl 4;
  w := (w and $CCCC) shr 2 or (w and $3333) shl 2;
  Result := (w and $AAAA) shr 1 or (w and $5555) shl 1;
end;

function TCRC16.CalcCRC16(Data: PByte; Count: Cardinal): Word;
begin
  Initialize;
  if FParams.RefIn then
    UpdateLSB(Data, Count)
  else
    UpdateMSB(Data, Count);
  Result := Complete;
end;

procedure TCRC16.CheckInitialized;
begin
  if FValue = nil then
    raise Exception.Create('You must call init first!');
end;

function TCRC16.Complete: Word;
begin
  CheckInitialized;
  if FParams.RefOut then
    Result := ReverseWord(FValue^) xor FParams.XorOut
  else
    Result := FValue^ xor FParams.XorOut;
  Dispose(FValue);
  FValue := nil;
end;

constructor TCRC16.Create(const Params: TCRC16Params);
const
  Test: AnsiString = '123456789';
var
  Check: Integer;
  Index: Byte;
  Value: Word;
  IsSet: Boolean;
begin
  FParams := Params;
	for Index := 0 to 255 do
  begin
    Value := Word(Index) shl 8;
    for Check := 0 to 7 do
    begin
      IsSet := Value and $8000 <> 0;
      Value := Value shl 1;
      if IsSet then
        Value := Value xor Params.Poly;
    end;
    FTable[Index] := Value;
  end;
  if CalcCRC16(PByte(Test), Length(Test)) <> FParams.Check then
    raise Exception.Create('Mismatch of the test value, possibly an error in the parameters.');
end;

procedure TCRC16.Initialize;
begin
  if FValue = nil then
    New(FValue);
  FValue^ := FParams.Init;
end;

procedure TCRC16.Update(Data: PByte; Count: Cardinal);
begin
  CheckInitialized;
  if FParams.RefIn then
    UpdateLSB(Data, Count)
  else
    UpdateMSB(Data, Count);
end;

procedure TCRC16.UpdateLSB(Data: PByte; Count: Cardinal);
var
  Index: NativeUInt;
begin
  for Index := NativeUInt(Data) to NativeUInt(Data) + Pred(Count) do
    FValue^ := FValue^ shl 8 xor FTable[Byte(FValue^ shr 8) xor ReverseByte(PByte(Index)^)];
end;

procedure TCRC16.UpdateMSB(Data: PByte; Count: Cardinal);
var
  Index: NativeUInt;
begin
  for Index := NativeUInt(Data) to NativeUInt(Data) + Pred(Count) do
    FValue^ := FValue^ shl 8 xor FTable[Byte(FValue^ shr 8) xor PByte(Index)^];
end;

const
  CRC16Test1: array of Byte = [$02, $01, $00, $02, $01, $14];
  CRC16Test2: array of Byte = [$02, $01, $00, $02, $01, $13];
 
begin
  try
    with TCRC16.Create(CRC16BYPASS) do
    try
      WriteLn('0x', CalcCRC16(PByte(CRC16Test1), Length(CRC16Test1)).ToHexString(4));
      WriteLn('0x', CalcCRC16(PByte(CRC16Test2), Length(CRC16Test2)).ToHexString(4));
    finally
      Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.


Параметры для других модификаций CRC16 (буде понадобятся) можно взять здесь .
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024070
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Вот эта функция гарантированно правильно считает CRC для ModBus

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
function GetCrcModbus(const data : TBytes) : word;
var
   f : word;
   i, j : integer;
begin
     Result := $FFFF ;
     for i := 0 to Length(data)-1 do
      begin
           Result := Result xor data[i];
           for j := 1 to 8 do
            begin
                 f := Result and 1;
                 Result  := Result shr 1;
                 if f = 1 then  Result := Result xor $A001;
            end;
      end;
     f := Result shr 8;
     Result := ((Result shl 8) or f);
end;
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024071
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Это не BUYPASS.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024072
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
alekcvp
defecator,

Это не BUYPASS.


я всё не дочитал, только досюда 22241575
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024077
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

наворочено. но рабочий. Спасибо.
...
Рейтинг: 0 / 0
Расчет контрольной суммы (RS-232)
    #40024086
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran
alekcvp,
наворочено. но рабочий. Спасибо.

Ну это универсальный алгоритм Crc16, который можно подогнать под любой параметрами.
Ничего не мешает вырезать из него только BUYPASS.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Расчет контрольной суммы (RS-232)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]