CRC 16 CCIT/X25 hesaplama sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam zaten sizin dediğiniz biçimde comporta veriyi söyle gönderiyor.

Kod: Tümünü seç

#27#26#02#08#3A#53#64#89#47#65#89#45#42#45#45#44#7E 
burdan başlıyor text yazdığım sayı.

Kod: Tümünü seç

#3A#53#64#89#47#65#89#45#
bu durumda

Kod: Tümünü seç

#3A#53#
3 iki kere almıs oluyor bide söyle bir durum var hocam 2 karakterden itibaren alıyorum cunku ilk karakterin yanına "A" eklemem gerekli
yani orda texte 15 karakter var ben ilkini pass ikiye bölmüyorum ilkini 1 sonraki rakamları 2şere ayırıyorum sanırım orada karıstırdınız.yani
ilk karakter bu sonra ikiye ayırdığım karakterlerde bu.

Kod: Tümünü seç

#65#64#89#47#65#89#45
normalde 2 karakterden başlarsam.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Hocam şöyle bir baktım da gönderiyorum dediğin strDeger içerisine

Kod: Tümünü seç

strVeri  :=... ... +Tersle( Sonuc )+Chr($7E);
demişsin.
Daha Sonuc oluşmadan hangi değerin tersle() sonucunu strVeri ekliyorsun ?

Sonuc değerini ve Tersle() fonksiyonuna verince dönen değerini bir söyler misin ?
Kodlarından anlayamadım. Karmaşık geldi.
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam orayı belirtmemişim kusura bakmayın.strveriyi söyle yaparak sonuc cardinalini ekledım.

Kod: Tümünü seç

x:=Chr( StrToInt( '$' + sEdit45.Text[1]+'A'))+ Chr(StrToInt( '$' +yaziyicevir(k) ))+ Chr(StrToInt( '$' +yaziyicevir(a) ))+ Chr(StrToInt( '$' +yaziyicevir(b) ))+ Chr(StrToInt( '$' +yaziyicevir(c) ))+ Chr(StrToInt( '$' +yaziyicevir(d) ))+ Chr(StrToInt( '$' +yaziyicevir(g) ))+ Chr(StrToInt( '$' +yaziyicevir(h) ));
Sonuc    := CRC16_ozel(x);
strVeri  :=Chr($27)+Chr($26)+Chr($02)+Chr($08)+ Chr( StrToInt( '$' + sEdit45.Text[1]+'A'))+ Chr(StrToInt( '$' +yaziyicevir(k) ))+ Chr(StrToInt( '$' +yaziyicevir(a) ))+ Chr(StrToInt( '$' +yaziyicevir(b) ))+ Chr(StrToInt( '$' +yaziyicevir(c) ))+ Chr(StrToInt( '$' +yaziyicevir(d) ))+ Chr(StrToInt( '$' +yaziyicevir(g) ))+ Chr(StrToInt( '$' +yaziyicevir(h) ))+Tersle( Sonuc )+Chr($7E);
ShowMessageFmt( '%x', [ Sonuc ] );
x adında string olusturdum ardından sonucu ona bağladım ardından o sonucu stri verinin sonuna ekledım.sonucu showmessaga doğru cıkarıyor ama veriyi comporttan gonderırken ekstra olarak 33 gönderiyor.showmessagedeki cıkan sonucu göndermiyor eksta iki tane 33 ekliyor araya.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

ComPort'a giden veriyi gitmeden hemen önce nasıl bir değişkene atıyorsun. Buffer kaç byte uzunluğunda ? O kısmı da yazmalısın... Buraya kadar zaten sorun yokmuş ki neyi arıyoruz
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam şimdi sorun şu Sonuc cadinalı showmessagede şu sayının karşılığı

Kod: Tümünü seç

356469874569854
bunu gösteriyor.
şimdi aynı sekilde comporttan veri gönderirken strverinin sonuna Sonuc cardinalını ekliyorum.şimdi normalde 6339 göndermesi gerekirken yani söyle olması gerekirken.

Kod: Tümünü seç

#27#26#02#08#3A#65#64#89#47#65#89#45#39#36#7E  
söyle oluyor

Kod: Tümünü seç

#27#26#02#08#3A#65#64#89#47#65#89#45#33#39#36#33#7E
yanı sondaki sonuc cardinalının arasına

Kod: Tümünü seç

#33#39#36#33
gördüğünüz gibi iki tane bir başına bide sonuna #33 eklenmiş oluyor.işte bu 33ler neden ekleniyor onu bulamadım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Kafamı iyice karıştırdın.
63-39 tersi 39-36 yani ikinciyi düz birinciyi ters mi kullanıyorsun.
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam ters porta ters göndermem gerekli .ben şidmi baştan bidaha anlatim.şimdi benim program harici bu işi yapan başka bir programın hesaplama sistemini gösterim daha iyi kavramış olursunuz.
bakın bu comporttan istediğim numarayı istediğim şekilde hesaplıyan program.
şu text yazdığımız numaramız.

Kod: Tümünü seç

356469874569854
bu ikili bölümlere ayırdığımız yer(ilk te yazan karakter haric onun yanına "A"ekleyik geri kalan 14 karakteri 2şer sayıya bölüyor.)

Kod: Tümünü seç

3A 56 46 98 74 56 98 54
buda bize verdiği sonuc. bu veriyi comporttan gönderiği hali şu.

Kod: Tümünü seç

$3A $56 $46 $98 $74 $56 $98 $54 $9B $A2 $7E
bunu kendi programıma ayarladığım zaman.
yani bu programa göre sistem söyle işliyor.

x stirng olarak alalım.
c CRC hesaplamasının sonucu olarak alalım.

Kod: Tümünü seç

x:=Chr('$3A')+Chr('$56')+Chr('$46')+Chr('$98')+Chr('$74')+Chr('$56')+Chr('$98')+Chr('$54')+c+Chr('$7E')

Kod: Tümünü seç

comport1.WriteStr(x);
olarak doğru gönderiyor.ve işlem başarıyor.
ben yukardaki gibi yaptığım zaman yani. bir text sayı yazıp ters cevirip+sonuc aldığımda araya sayılar ekliyor.bakın ben söyle yapıyorum.

Kod: Tümünü seç

Var
  strVeri  : String;
  Sonuc    : Cardinal;
  k:string;
  a:string;
  b:string;
  c:string;
  d:string;
  g:string;
  h:string;
  x:string;
begin
k:=copy(sedit45.Text,2,2);
a:=copy(sedit45.Text,4,2);
b:=copy(sedit45.Text,6,2);
c:=copy(sedit45.Text,8,2);
d:=copy(sedit45.Text,10,2);
g:=copy(sedit45.Text,12,2);
h:=copy(sedit45.Text,14,2);
x:=Chr( StrToInt( '$' + sEdit45.Text[1]+'A'))+ Chr(StrToInt( '$' +yaziyicevir(k) ))+ Chr(StrToInt( '$' +yaziyicevir(a) ))+ Chr(StrToInt( '$' +yaziyicevir(b) ))+ Chr(StrToInt( '$' +yaziyicevir(c) ))+ Chr(StrToInt( '$' +yaziyicevir(d) ))+ Chr(StrToInt( '$' +yaziyicevir(g) ))+ Chr(StrToInt( '$' +yaziyicevir(h) ));
Sonuc    := CRC16_ozel(x);
strVeri  :=Chr($27)+Chr($26)+Chr($02)+Chr($08)+ Chr( StrToInt( '$' + sEdit45.Text[1]+'A'))+ Chr(StrToInt( '$' +yaziyicevir(k) ))+ Chr(StrToInt( '$' +yaziyicevir(a) ))+ Chr(StrToInt( '$' +yaziyicevir(b) ))+ Chr(StrToInt( '$' +yaziyicevir(c) ))+ Chr(StrToInt( '$' +yaziyicevir(d) ))+ Chr(StrToInt( '$' +yaziyicevir(g) ))+ Chr(StrToInt( '$' +yaziyicevir(h) ))+Tersle( Sonuc )+Chr($7E);
ShowMessageFmt( '%x', [ Sonuc ] );
ben yaptığımda comporta veriyi.söyle gönderiyor.

Kod: Tümünü seç

#27#26#02#08#3A#65#64#89#47#65#89#45#33#39#36#33#7E
bana showmessagenın verdiği sonuc.doğru bir sonuc yani.

Kod: Tümünü seç

ShowMessageFmt( '%x', [ Sonuc ] );
burda doğru sonuc veriyor yani burdaki sonuc ve veriyede doğru gönderiyor ama araya iki tane #33 ekliyor.işte ben neden araya 2 tane #33 eklediğini bulamadım hocam benım sorunum bu.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Hocam verdiğin açıklama da karışık.

Kod: Tümünü seç

x:=Chr('$3A')+Chr('$56')+Chr('$46')+Chr('$98')+Chr('$74')+Chr('$56')+Chr('$98')+Chr('$54')+c+Chr('$7E')
başında neden

Kod: Tümünü seç

Chr($27)+Chr($26)+Chr($02)+Chr($08)
ifadesi yer almıyor. Hesaplar daima hep farklı çıkacaktır.

Sen bana doğru bir akış ver ben de sana fonksiyonu yazayım olsun bitsin. :roll:
Bir üstte $3A+$56+$46+$98 şeklinde sıralı yani yer değişikliği olmaksızın giderken bir altta yaziyicevir ile yer değişmesini sağlıyorsun.

Şimdi doğru olarak değerlendirdiğin yukarıdaki ifade yerine yanlış bir dizilimi karşılaştırıyorsun.
Daha önce yukarıdaki ifade 6339 veriyorken şimdi 9BA2 olarak ifade ediyorsun. 9BE2 rakamını ben de buldum ama aşağıdaki şekilde "yerdeğiş" yapmazsan çıkıyor.
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen mrmarman »

Kod: Tümünü seç

procedure TForm1.BitBtn1Click(Sender: TObject);
//----------------------------------------------------------------------------//
  function CRC16_ozel( strDeger:String ):Cardinal;
    const
      bMask : array[0..31] of DWord =
        ($00000001, $00000002, $00000004, $00000008,
         $00000010, $00000020, $00000040, $00000080,
         $00000100, $00000200, $00000400, $00000800,
         $00001000, $00002000, $00004000, $00008000,
         $00010000, $00020000, $00040000, $00080000,
         $00100000, $00200000, $00400000, $00800000,
         $01000000, $02000000, $04000000, $08000000,
         $10000000, $20000000, $40000000, $80000000);
    function CrcReflect(dwDeger: DWord; BitSay:Word ): DWord;
    var
      i   : Integer;
    begin
      Result := dwDeger;
      for i := 0 to (BitSay-1) do
      begin
        if (dwDeger and 1) <> 0
        then Result := Result or      bMask[(BitSay-1) - i]
        else Result := Result and not bMask[(BitSay-1) - i];
        dwDeger := dwDeger shr 1;
      end;
    end;
  var
    i,j: Integer;
    Data   : DWord;
  begin
    Result := $FFFF;
    for i  := 1 to Length(strDeger) do
    begin
      Data   := CrcReflect( Ord(strDeger[i] ), 8 );
      Result := Result xor ( Data shl 8 );
      for j := 0 to 7 do
      begin
        if (Result and $8000 ) <> 0
          then Result:=(Result shl 1) xor $1021
          else Result:= Result shl 1;
        Result := Result and $FFFF;
      end;
    end;
    Result:= CrcReflect( Result, 16 ) xor $FFFF;
  end;
//----------------------------------------------------------------------------//
  Function SartliCevir(S : String): String;
  Var
    i :Integer;
  Begin
    Result := '';
    for i := 1 to Length(S) do Result := S[i] + Result;
    for i := 1 To Length(Result) Do
    case ord( Result[i]) of
    40  : Result[i] :=chr(41);
    41  : Result[i] :=chr(40);
    end;
  end;
//----------------------------------------------------------------------------//
  Function YerDegis( Deger:Cardinal ): String;
  Var
    strDeger : String;
  begin
    strDeger := Format('%4x', [Deger]);
    Result   := Chr( StrToInt( '$' + Copy(strDeger, 3, 2) ) ) + Chr( StrToInt( '$' + Copy(strDeger, 1, 2) ) );
  end;
//----------------------------------------------------------------------------//
  function HexGoster( strVeri: String ): String;
  Var
    strX : String;
    i : Integer;
  begin
    strX := '';
    for I := 1 to Length(strVeri) do strX := strX + Format('$%.2x, ',[ Ord(strVeri[i])]);
    Result := strX;
  end;
//----------------------------------------------------------------------------//
Const
  strProtokol = Chr($27)+ Chr($26)+ Chr($02)+ Chr($08);
Var
  strText,
  strTextBin,
  strSonucBin,
  strComPortGidecek,
  strX    : String;
  Sonuc   : Cardinal;
  i       : Integer;
begin
  strText := '356469874569854';
// Tek haneli ise ki öyle, ilk sıraya 'A' ekliyoruz sonra yer değişecek...
  if Length( strText ) mod 2 = 1 then strtext := 'A' + strText;

// Text ifadeyi Chr haline dönüştürüyoruz.
  strTextBin := '';
  i := 1;
  while i < Length(strText) do
  begin
    strTextBin := strTextBin + Chr( StrToInt( '$' + SartliCevir( Copy(strText, i, 2) ) ) );
    inc(i, 2);
  end;
// İlk Sonucumuzu alıyrouz...
  Sonuc       := CRC16_ozel( strTextBin ); // $63, $39
  strSonucBin := YerDegis( sonuc );        // $39, $63

  strComPortGidecek := strProtokol + strTextBin + strSonucBin + Chr( StrToInt('$7E') );
  // $27, $26, $02, $08, $3A, $65, $64, $89, $47, $65, $89, $45, $39, $63, $7E
  showmessageFmt('%x'#13'%s'#13'%s', [ sonuc, strText, HexGoster( strComPortGidecek ) ]);
end;
Bir de senin YaziyiCevir fonksiyonunu SartliCevir diye sadeleştirdim. Çünkü sadece 40h ise 41h, 41h ise 40h olarek deşiklik üzerine bir yapı söz konusu.
Resim
Resim ....Resim
seci20

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen seci20 »

hocam cok cok teşekkür ederim benim yazdığımla sizin yazdığınızı birlestırdım 2 gunun sonunda çözüm ALLAH sizden razı olsun hocam.
hakanhan84
Üye
Mesajlar: 3
Kayıt: 06 Ağu 2014 05:24

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen hakanhan84 »

Hocam merhaba,
CRC16_ARC için bir fonklsiyon var mı? nasıl yapabiliriz.
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: CRC 16 CCIT/X25 hesaplama sorunu

Mesaj gönderen adelphiforumz »

Belki biraz konu dışı olabilir fakat bir şeyleri araştırırken olur olmadık yerlerden işe yarar bilgilier çıkıyor
bende elimdeki bir kaç fonksiyonu konu altına ekliyeyim dedim

Kod: Tümünü seç

function fn_Fatek_CRC16_ModeBus(pData:String):String;
var
  CRC: word;
  N, I: integer;
  B:byte;
begin
  CRC := $FFFF;
  for I := 1 to Length (pData) do
  begin
    B := Ord(pData[I]);
    CRC := CRC xor B;
    for N := 1 to 8 do
    begin
      if (CRC and 1)<>0 then
        CRC := (CRC shr 1) xor $A001
      else
        CRC := CRC shr 1;
    end;
  end;
 Result := Chr(CRC and $ff) + Chr(CRC shr 8);
end;

function fn_Fatek_LRC_Hesapla(pData:String):String;
var
  T, I : Integer;
  H : String;
begin
  T := 0;
  for I := 1 to Length(pData) do
    T := T + Ord(pData[I]);
  H := IntToHex(T, 8);
  Result := H[7] + H[8];
end;

function fn_BCC_Bul(FVeri: String):String;
var i,x:Integer;
begin
  x:= ord(FVeri[1]) xor ord(FVeri[2]);
  for i := 3 to Length(FVeri) do
  begin
    x:= x xor Ord(FVeri[i]);
  end;
  Result := IntToHex(x, 2);
end;

function fn_CheckLRC(const s: AnsiString): byte;
var i: integer;
begin
  result := 0;
  for i := 1 to length(s) do
    inc(result,ord(s[i]));
  result := (result xor $FF)+1; // or result := (not result)+1;
end;

function fn_ChuckSumLRC(pStr : string) :byte;
var i : Integer;
  Len : integer;
  lrc : byte;
begin
  Len := length(pStr);
  lrc := 0;
  if len > 0 then
  begin
    lrc := ord(len);
    for i := 2 to Len do
      lrc := lrc xor (Ord(pStr[i-1]));
    end;
  Result := lrc;
end;

function fn_BarCodeEAN13_CheckDigit_Hesapla(FVeri: String):String;
var i:Integer;
ModKalan, ToplamTek, ToplamCift:Integer;
begin
  ToplamTek  := 0;
  ToplamCift := 0;
  for I := 1 to 12 do
  begin
    case I of
     1,3,5,7,9,11  : ToplamTek  := ToplamTek  + StrToInt(FVeri[i]);
     2,4,6,8,10,12 : ToplamCift := ToplamCift + StrToInt(FVeri[i]);
    end;
  end;
  ModKalan := ((ToplamCift * 3) + ToplamTek) Mod 10;
  if ModKalan = 0 then
    Result := IntToStr(ModKalan)
  else
    Result := IntToStr(10 - ModKalan);
end;

Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Cevapla