2014-01-08 106 views
0

我實際上想在matlab中爲Modbus協議生成crc,並且我在matlab中使用了以下代碼。我也給消息數組作爲message=uint16([hex2dec('01') hex2dec('02') hex2dec('00') hex2dec('C4') hex2dec('00') hex2dec('16')]);和BITAND並在最後0xFFFF的完成,但無法給出正確的CRC ..CRC 16 in matlab

我的代碼的下方,預計CRC是B839按了Modbus CRC計算器但它給予B8DD(47325十進制)。如果代碼中有任何更改,請幫助我。謝謝。

function crc_val = crc3 (~) 
crc = uint16(hex2dec('1D0F')); % Non-augmented initial value equivalent to augmented initial value 0xFFFF 
polynomial = hex2dec('1021'); % Polynomial 
message=uint16([hex2dec('01') hex2dec('02') hex2dec('00') hex2dec('C4') hex2dec('00') hex2dec('16') hex2dec('00') hex2dec('00')]); 
for i = 1:(length(message)-2) % Not taking the last 2 bytes because they are the CRC. 
    crc = bitxor(crc, bitsll(message(i), 8)); 
    for j = 1:8 
     if (bitand(crc, hex2dec('8000')) > 0); 
      crc = bitxor(bitsll(crc, 1), polynomial); 
     else 
      crc = bitsll(crc, 1); 
     end 
    end 
end 
crc_val = bitand(crc, hex2dec('ffff')); 

end 
+0

鏈接的[CRC 16 FEX提交](http://www.mathworks.in/matlabcentral/fileexchange/26741-crc-16/content/crc16.m)包含大約4行實際代碼,它們似乎可以滿足您的所有需求。嘗試理解這些,並直接使用它們,或者首先嚐試改進你的代碼。 –

回答

0

你有沒有嘗試this。它可以作爲BSD許可證。您不會面臨任何可能的授權問題。以下說明CRC實際上的工作原理。 following也有助於理解這個概念。

%usage: crc16(input vector). 

//

function [resto] = crc16(h) 
    % g(X) = X^16+X^15+X^2+1 
    gx = [1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1]; 
    % P(X) is given input vector 
    px = h; 
    %Calculate P(x)x^r 
    pxr=[px zeros(1,length(gx)-1)]; 
    % deconvolve (r), entre pxr y gx 
    [c r]=deconv(pxr,gx); 

    r=mod(abs(r),2); 
    % returncrc-16 
    resto=r(length(px)+1:end); 
end 
+0

謝謝你Vamsi Krishna爲了您的回覆,我會很高興,如果你能幫助我將上述代碼改進到預期的輸出 – pema

+0

由於這不是一個答案(它基本上只是一個鏈接,如果它打破了什麼也沒有留下)我已經標記了這個成爲一個評論,但如果你能夠詳細說明,解釋什麼是'這個'以及如何使用它,當然它可以成爲一個答案。 –

+0

可以請你在(http://www.mathworks.in/matlabcentral/fileexchange/26741-crc-16/content/crc16.m)解釋代碼並給出一些修改提示......我覺得很難理解。 – pema