Comport Check sum

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Comport Check sum

Mesaj gönderen ibrahimcoban »

Comport dan bağlanan bir cihaz için program yazmam gerekiyor.
Checksum olayına takıldım. İngilizcem yeterli gelmedi.
Aşağıdaki metni çevirebilir misiniz?

------------------------------------------------------------------------
Chechsum: 2 bytes hex number.
Low-order 8-bit data of the complement of 2 for the sum of text data.
------------------------------------------------------------------------

Yardımlarınızı bekliyorum.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

vaktiyle şöyle bir şeyi konuşmuşuz.

viewtopic.php?t=14897&highlight=checksum
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Murat Bey!

Ben checksum ın ne olduğunu biliyorumda yukardaki paragrafı Türkçe' ye çevirebilir misiniz diye sordum.
Hesaplama için neler gerektiğini anlamaya çalışıyorum.
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Arkadaşlar Lütfen İngilizcesi olan çevirebilir mi ?

Chechsum: 2 bytes hex number.
Low-order 8-bit data of the complement of 2 for the sum of text data.
mkysoft
Kıdemli Üye
Mesajlar: 3103
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

daha önce baktım çevirimin yetersiz olduğunu düşündüğümden göndermemiştin. başlangıç olması açısından ne demek istediğini anlatmaya çalışayım. hata olabilir kusura bakma.
Chechsum: 2 bytes hex number.
Low-order 8-bit data of the complement of 2 for the sum of text data.
Kontrol değeri 2 bytedan oluşuyormuş. yani 32 bitlik bir değer.
bu 32 bitlik değeri, verin içerinde yer alan karakterlerin ilk 8 bitinin (genelde verilerin zaten 8 bitliktir, koruma amaçlı koyulmuş bir önlem sanırım) 2'ye tümleyenini bularak topluyorsun.
2 ye tümleyen konusu için
http://www.thescripts.com/forum/thread518226.html
bu adrese bakabilirsin.
2.ye tümleyen genel olarak = tüm bitlerin tersi + 1 olarak açıklanabilir. ancak negatif sayılar ile ilgili farklı şeylerden basedilmiş. sen burda sayılar ile uğraşmadığından problem olmaz sanırım.
örnek:
(0000 0010) tümleyeni (1111 1110) 'dir.
adım adım çözümü:
önce tersini alalım (1111 1101)
1 ile toplayalım (1111 1101)+(0000 0001)=(1111 1110)

kolay gelsin.
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Deneyemedim ama Hocam cevap için çok teşekkür ederim.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

1. byte = data, 2. byte = checksum.

örneğin com porta veri gönderirken, cihaz ilk baytı DATA kabul ediyor ardından gelen 2. byte checksum olarak kabul ediyor.

verdiğimiz örneklerde bire bir ingilizce çevirisi yoktu ama istediğin şeyin RESMİ vardı. Bakıp yorum yapılabilirdi..

Saygılar..
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Sayın Murat Dicle

Bir örnek vereyim daha kolay anlarız sanırım.

02 30 2f 33 32 2d 30 31 2f 30 31 30 39 2f 38 36 0d

Burda 02 başlangıc biti 0d bitiş biti.

38 36 ise checksum bunu bulmaya çalışıyorum.
Kullanıcı avatarı
cuneyt22
Üye
Mesajlar: 213
Kayıt: 07 Şub 2004 03:32
İletişim:

Mesaj gönderen cuneyt22 »

checksum kontrol bitidir. gönderilen verinin karşıya doğru gönderilip gönderilmediğni kontrol etmek içindir. göndereceğiniz veriyi öncelikle sayıya çeviriyorsunuz.daha sonra bunları toplayıp mod 256 alıyorsun. sonrada bunları tekrar karaktere çevirip hex decimale çeviriyorsun oda sana 2 karakterlik bir bit geri gonderecektir.hepsi bu kadar.. şuan askerde olduğum için kodları yazamıyorum kolay gelsin
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

bahsedilen 2 bytelık CRC olabilir.

Kod: Tümünü seç

procedure Tfrmain.Button1Click(Sender: TObject);
function CalcCRC(s: string): string;
var
  CRC, i, j, k, l: Word;
  b: Byte;
begin
  CRC := $00;
  l := length(s);

  for i := 1 to l do
  begin
    b := Ord(s[i]);
    for j := 1 to 8 do
    begin
      k := (b xor CRC) and 1;
      CRC := CRC shr 1;
      if k = 1 then
        CRC := CRC xor $A001;
      b := b shr 1;
    end;
  end;
  result := IntToHex(CRC, 4);
end;
begin
  inherited;
  ShowMessage(CalcCRC('303132333435'));
end;
şunu bir deneyin,
sizin verdiğiniz data katarında 3836 çıkmıyor, bu dataları örnek olsun diye farazi mi verdiniz yoksa seri kanaldan okunan gerçek datalar mı?
ÜŞENME,ERTELEME,VAZGEÇME
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Datalar şöyle ben hex karşılıklarını vermiştim.

#020/32-01/0109/86#0d

/32-01/0109/ hesaplanan data burası.

#02 başlangıç biti. # 0d bitiş biti.

burda 86 hesaplamada ortaya çıkan cheksum.
ben bunu bulmaya çalışıyorum.

Cheksum nasıl yapılacağını
Check sum: 2 bytes hex number.
Low-order 8-bit data of the complement of 2 for the sum of text data.

bu şekilde yazmışlar fakat hesaplama örneği yok.

bir diğeri

#020/32-01/0120/8D#0d

çıkan checksum 8D

#02 ve #0d ASCII değil ben belli olsun diye böyle yazdım diğerleri ASCII
ibrahimcoban
Üye
Mesajlar: 163
Kayıt: 11 Eki 2005 10:44
İletişim:

Mesaj gönderen ibrahimcoban »

Merhaba Arkadaşlar!

Checksum un bir bitini bulmayı başardım ama diğerini bulamadım.

Kod: Tümünü seç

function Crc(al: string) : string;
var
a,i : integer;
hex : string;
begin
a:=0;
for i:=1 to Length(al) do
  begin
   a:=a+ord(al[i]);
  end;
hex:=copy(IntToHex(a,4),3,2);
a:=strtoint('$'+hex);
a:=256-a;
Result:=copy(IntToHex(a,4),4,1);
end;
Bu fonksiyonla
Crc('/20-00/D2/')=E çıkıyor.
çıkması gereken DE.

diğer bir örnek
Crc('/99-00/')=3
çıkması gereken 73

bir diğeri
Crc('/21-00/D7/')=8
çıkması gereken D8

yani bir basamağını bulabiliyorum ama diğerini bulamadım.

Allah rızası için yardımlarınızı bekliyorum.
Cevapla