Comport Check sum
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
Comport Check sum
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.
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.
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
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.
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.
Kontrol değeri 2 bytedan oluşuyormuş. yani 32 bitlik bir değer.Chechsum: 2 bytes hex number.
Low-order 8-bit data of the complement of 2 for the sum of text data.
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.
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
- Murat DİCLE
- Kıdemli Üye
- Mesajlar: 702
- Kayıt: 19 Nis 2006 04:12
- Konum: İstanbul
- İletişim:
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
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
bahsedilen 2 bytelık CRC olabilir.
ş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ı?
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;
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
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
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
#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
-
- Üye
- Mesajlar: 163
- Kayıt: 11 Eki 2005 10:44
- İletişim:
Merhaba Arkadaşlar!
Checksum un bir bitini bulmayı başardım ama diğerini bulamadım.
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.
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;
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.