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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.08.2013, 12:01   #1
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
Восклицание как рассчитать fcs - frame check sequence

Доброе время суток.
Есть устройсво (rfid считыватель), нужно написать на Delphi программу для обмена данными с этим устройсвом. Протокол известен, но возникли трудности с расчетом FCS, я так понимаю это и есть CRC16?
Сталкивался ли кто может подскажите что к чему или ссылочек киньте.
Спасибо.
_Night_Scream_ вне форума Ответить с цитированием
Старый 08.08.2013, 15:42   #2
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
Восклицание

Бесконтактный считыватель PROX 13мгц-Reader.
http://prox.ru/index.php?item=13mhz-rw-232
FCS в данном протоколе реализована согласно стандартам CCITT X.25 или ISO/IEC 3309 или RFC1331 (PPP).
Полином 0х8408.
А кто нить сам реализовывал?
Вот из сниффера - запрос FD C7 02 02 F1 50 FE
ответ FD C7 02 03 78 41 FE
FD,FE - начало, конец.
C7 - идентификатор кадра
02 - команда
02 - данные команды
F1,50 - FCS который нифига не могу понять
Хотелось бы написать ручками. Но за бибку спасибо!

В ГОСТе ИСО/МЭК 3309-98
на 9ой страничке есть описание. Но не пойму даже что такое X ???
_Night_Scream_ вне форума Ответить с цитированием
Старый 08.08.2013, 22:02   #3
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
Плохо

Всем лень? или никто правда не знает?
_Night_Scream_ вне форума Ответить с цитированием
Старый 09.08.2013, 11:43   #4
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

свои наработки давай
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Старый 09.08.2013, 20:11   #5
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
По умолчанию

Да в общем вот что получилось, помогли чуть. Пока разбираюсь, думаю вопросы еще возникнут.
var
FCS: Word;

procedure X_FCS(_D: Byte);
var
_i: Integer;
_w: Word;
begin
_w := _D xor (FCS and $FF);
_i := 8;
repeat
if Boolean(_w and 1) then
begin
_w := _w shr 1;
_w := _w xor $8408;
end
else
_w := _w shr 1;
Dec(_i);
until _i = 0;
FCS := _w xor (FCS shr 8);
end;


var
Request: array[0..6] of Byte = ($FD, $C7, $02, $02, $F1, $50, $FE);

procedure TfrmMain.Button2Click(Sender: TObject);
var
i: Integer;

begin
FCS := $FFFF;
for i := 1 to SizeOf(Request) - SizeOf(FCS) - 2 do
X_FCS(Request[i]);
ShowMessage(IntToHex(not FCS, 4));
end;
_Night_Scream_ вне форума Ответить с цитированием
Старый 09.08.2013, 20:15   #6
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
По умолчанию

Много гуглил и не нашел как Word в 2 байта разделить.
Не подскажет ли кто?
Собственно в случае FCS можно воспользоваться конечно hi и lo, но хотелось бы и такой вариант узнать.
_Night_Scream_ вне форума Ответить с цитированием
Старый 09.08.2013, 20:44   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

div и mod на 256 не устраивает?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.08.2013, 12:50   #8
_Night_Scream_
 
Регистрация: 08.11.2012
Сообщений: 7
По умолчанию

Конечно устраивает. А если будет 4х байтовое? В CRC32 например, надо отправлять 4х байтовое число ведь.
Нет ли какой нить функции разложения х-байтового числа в масив из х байт?
_Night_Scream_ вне форума Ответить с цитированием
Старый 10.08.2013, 13:11   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

С DWORD можно так поиграться
Код:
procedure TForm1.Button1Click(Sender: TObject);
var b: array [0..3] of Byte;
    p: ^Cardinal;
    c: Cardinal;
begin
  p:=@b[0];
  c:=$FF0F0901;
  p^:=c;
  Label1.Caption:=IntToStr(b[3]);
  Label2.Caption:=IntToStr(b[2]);
  Label3.Caption:=IntToStr(b[1]);
  Label4.Caption:=IntToStr(b[0]);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.08.2013, 07:25   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Такая функция пишется вручную за минуту.
Код:
function GetByteOfInt(val: Integer; place: Byte): Byte;
begin
  Result := val shr (place * 8) and $FF;
end;
от 0го до 3го байта (параметр place) позволяет таскать из инта (можно сделать перегрузку для ворда и инт64 или даже для указателя)
phomm вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как у Frame сделать закругленные края? pavellyba Общие вопросы Delphi 1 16.04.2011 03:13
Как научить программу создавать несколько Frame? pavellyba Общие вопросы Delphi 3 05.04.2011 00:18
Как рассчитать возраст sql запрос slai БД в Delphi 5 28.09.2010 11:02
Как рассчитать периметр фигуры Kuzia Microsoft Office Excel 4 24.12.2009 07:51
Как рассчитать значения в табеле? fs444 Microsoft Office Excel 2 16.11.2009 13:10