找个会CRC-16(CCITT)的人,有没有???(200分)

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
同时请关注另外一个帖子:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1385808
===========================================================
下面的字符串是某个设备发出的指令,需要在后面计算效验位,但是按照它的协议说的
去算,得不到它自己算出来的效验码,到底怎么回事呢?
16,2,6,0,6,0,1,64,16,3,(241,36),复位
16,2,6,0,6,0,1,8,16,3,(49,144),静音
16,2,6,0,6,0,1,32,16,3,(244,105),隔离i
前面的10个字符是命令串,后面的两位是它算出来的效验码(上面的内容都是直接测出来的,
并非我算出来的),我想知道它到底是怎么算出来的?
参考资料:

Byte Order DLE STX Command Network ID Zone ID Sector ID
No Bytes 1 1 1 1 1 1

Data Length Data DLE ETX CRC
1 [0-128] 1 1 2

The CRC used is CRC-16 (CCiTT).
The CRC includes everything from the first DLE to the ETX..
Byte stuffing of DLE: Any DLE character is followed by either an STX, ETX or
another DLE. If a DLE character is found in the data stream then an addition DLE character is inserted. The byte stuffing occurs between the DLE STX and the DLE ETX.
Predefined characters:
STX 02Hex
ETX 03Hex
ACK 06Hex
NAK 15Hex
DLE 10Hex
我想问的问题是:
(1)估计这个设备采用的CRC算法的多项式是什么?$1021?还是$F005?还是其它的?
(可是我从$1一直猜到$FFFF都得不到它自己算出来的结果)
// $1021, CRC-CCITT, X16+X12+X5+1
// $F005, CRC-16, X16+X15+X2+1
(2)大家用自己的效验算法,根据$1021和$F005来计算,我给的3个例子,你们都算出来什么效验码了?
我算出来的三条分别是
9CD9(多项式为$1021),4E10(多项式为$F005);
5515(多项式为$1021),8131(多项式为$F005);
F07F(多项式为$1021),AF0A(多项式为$F005);
希望大家也能把自己的贴出来,看看得多少,因为我用过好几个人的CRC效验程序了,都号称正在使用的,
没有问题,但是,算出来的结果都不一样,不知道谁对谁错了。
(3)哪位好心人,如果有时间,给我发一个你们的CRC-16(CCITT)的效验程序,让我研究一下。我的信箱
qinmin@371.net,如果需要看我的程序,请到这里下载。
http://asp2.6to23.com/crazycock/tmp/crc.rar(我使用winrar3压缩的)
要是没有装WinRar的朋友,到这里下
http://asp2.6to23.com/crazycock/tmp/crc.exe
------------------
谢谢大家。
 
// $F005, CRC-16, X16+X15+X2+1
错了,不是$F005,是$8005!

还有
16,2,6,0,6,0,1,64,16,3,(241,36),复位
最后两个用括号括起来的数字是什么含义,CRC有没有包含它们?
 
回catbrother:
谢谢指点,字符串是设备发送的命令,括号里面的数字是设备自己计算得到的效验码,
也就是说16,2,6,0,6,0,1,64,16,3这10个字符(16、2、6等是指他们的ASCII值)是需要计算
的内容,括号里面的内容是效验码,如果你通过计算,能把括号外面的内容算出括号内的
效验码就说明你对了,理解我的意思了么?
请catbrother再次指点。
 
16,2,6,0,6,0,1,64,16,3,(241,36),复位
16,2,6,0,6,0,1,8,16,3,(49,144),静音
16,2,6,0,6,0,1,32,16,3,(244,105),隔离i
这些值是怎么得到的?
 
第一个数组9CD9的结果我已经得到了,但还是没求到241,36这个结果。
我的程序使用delphi嵌入汇编写的,
需要的话我可以发给你
 
好的,我的信箱是crazycock@163.net
不过,241,36到底怎么得来的呢?多项式的范围是不是从$1到$FFFF呢?
 
多项式肯定不会从1-FFFF
我也就两个多项式:)
 
回catbrother:肯定不会从1-FFFF,怎么这样认为呢?CRC-16和CCITT不就是$1021和$8005么?
“我也就两个多项式:)”是什么意思?指什么呢?
 
我就1021和8005这两个多项式。
多项式是有依据的,不是随便找的!

你想试出多项式,那就编程找吧
 
我给你发一个串口调试工具,你把读到数据给我发一份(要16进制的),我看看吧
 
回carbrother:可是,我从$1到$FFFF都试了,也没有找到符合条件的值,到底这个多项式
和一个确切的值之间有什么联系呢?为什么由一个多项式可以得到一个确切的值呢?
$1021和$8005是怎么算出来的?
回resun:发到我信箱里吧。crazycock@163.net
 
crazycock@163.net好象出问题了,发到crazycock@163.com或者crazycock@263.net都可以,发了麻烦说一声。
 
已经给你发了,你试试吧,我们调试用的就是这个工具
 
好,我去看看。
 
收好了。
10 02 06 00 06 00 01 40 10 03 F1 24 复位
10 02 06 00 06 00 01 08 10 03 31 90 静音
10 02 06 00 06 00 01 20 10 03 F4 69 隔离
请看~~
我的程序接收的和你的一样的。
 
那个工具给我一份!!

CRC的目的就是为了最大可能发现误码,其中的理论我也不清楚
我不是学数学的!:)
 
我算了,的确算不出来,肯定还有隐含的处理过程
 
to catbrother
你告诉我你的信箱我才能给你发啊,:p
 
后退
顶部