通過串口除錯工具分別讀到以下五條資料,其中(30,31,32,33,34)是比較有規律的遞增的,但是(81,80,83,82,85)毫無規律,不知道是怎么計算出來的,請大俠幫忙,萬分感謝!

FA 80 31 30 30 30 34 05 00 01 30 81 FC
FA 80 31 30 30 30 34 05 00 01 31 80 FC
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC
uj5u.com熱心網友回復:
是自定義通訊協議?還是通用協議?串口通信用的比較多的是CRC16和累加和校驗uj5u.com熱心網友回復:
應該是CRC,但是倒推協議難度有點大~~~~uj5u.com熱心網友回復:
不清楚是什么樣的通訊協議,CRC有很多種協議嗎?如有很多,請用通用的幫忙我解釋一下,CRC16具體是怎么算出來的啊,非常感謝!uj5u.com熱心網友回復:
給你貼個曾用過的CRC16演算法例子看看吧///////////////////////////////////////////////////////////
// 16位CRC:按位計算,速度最慢,占用空間最少
// 注:資料流是高位先行
///////////////////////////////////////////////////////////
function CalCRC16(data, crc, genpoly: Word): Word;
var i: Integer;
begin
// 方法1:摘自XMODEM協議
crc := crc xor data;//(data shl 8);
for i:=0 to 7 do
if (crc and $0001) <> 0 then // 只測驗最高位
crc := (crc shr 1) xor genpoly // 最高位為1,移位和異或處理
else crc := crc shr 1; // 否則只移位(乘2)
Result := crc;
{
// 方法2:演算法有些不同,但結果相同
data := data shl 8; // 移到高位元組
for i:=7 downto 0 do
begin
if ((data xor crc) and $8000) <> 0 then // 只測驗最高位
crc := (crc shl 1) xor genpoly // 最高位為1,移位和異或處理
else crc := crc shl 1; // 否則只移位(乘2)
data := data shl 1; // 處理下一位
end;
Result := crc;
// 方法3:摘自<<CRC演算法原理及C語言實作>>
for i:=7 downto 0 do
begin
if (crc and $8000) <> 0 then
crc := (crc*2) xor genpoly // 余式CRC乘以2再求CRC
else crc := crc*2;
if (data and (1 shl i)) <> 0 then
crc := crc xor genpoly; // 再加上本位的CRC
end;
Result := crc;
}
uj5u.com熱心網友回復:
你想問什么?uj5u.com熱心網友回復:
幫頂下這方面經經驗 尚少uj5u.com熱心網友回復:
多謝大家的回復
請大俠給給一下c++ builder能直接用的代碼啊,萬分感謝!
最好能將資料 FA 80 31 30 30 30 34 05 00 01 30 81 FC ,中的紅色81直接算出來,其他資料也通過該演算法得出,多謝!多謝!
uj5u.com熱心網友回復:
在C++ builder中直接編譯pas檔案生成hpp就可以了。
uj5u.com熱心網友回復:
異或校驗,將要校驗的所有位元組時行一次異或就可以了,代碼標非常簡單我就不寫了。驗證方式:
打開Win7計算器,設定成程式員模式,顯示為位元組。復制下行到計算器就得得到結果
80^31^30^30^30^34^05^00^01^31=
uj5u.com熱心網友回復:
FA 80 31 30 30 30 34 05 00 01 30 81 FCFA 80 31 30 30 30 34 05 00 01 31 80 FC
FA 80 31 30 30 30 34 05 00 01 32 83 FC
FA 80 31 30 30 30 34 05 00 01 33 82 FC
FA 80 31 30 30 30 34 05 00 01 34 85 FC
FA 80 31 30 30 30 34 05 00 01 35 84 FC==>?
FA 80 31 30 30 30 34 05 00 01 36 87 FC==>
FA 80 31 30 30 30 34 05 00 01 37 86 FC==>
uj5u.com熱心網友回復:
crc校驗有一個自定義的種子碼。各家都不一樣,比如hongss貼出的代碼中的 genpoly,就是一個種子碼。演算法基本上是一樣的,但前提是你必須知道種子碼是多少。所以別人是無法給你直接算出結果的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/100384.html
標籤:VCL組件開發及應用
