校驗位計算方法:先把位元組頭+功能碼+位元組長度+資料位累加求和,累加的值高16bit的值加到低16bit上,即把累加中最高位的進位加到最低位上,最后進行取反。得到的值從高位到低位放入兩個0x00數中。
//這個是例程:
u16 checksum(u8 *buffer,u16 size)
{
u32 cksum=0;
u8 i=0;
for(i=0;i<size;i++)
{
cksum +=*buffer++;
}
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum +=(cksum >>16);//為什么要加這句
return ~cksum;
}
ULONG uSumL = 0;//之前所有資料的累計和
for (int n = 0; n < iOfst; n++) { uSumL += pTxData[n]; }//
//(高16位+低16位)后取反
WORD wSum = (WORD)(~(HIWORD(uSumL) + LOWORD(uSumL)));
請問大家,我第二段代碼這樣寫正確嗎
uj5u.com熱心網友回復:
這是第二段代碼的兩個校驗位結果pTxData[iOfst] = HIBYTE(wSum); iOfst++;
pTxData[iOfst] = LOBYTE(wSum); iOfst++;
和第一段代碼是一樣的效果嗎
uj5u.com熱心網友回復:
對照 windef.h 下定義的宏#define LOWORD(l) ((WORD)(((DWORD_PTR)(l)) & 0xffff))
#define HIWORD(l) ((WORD)((((DWORD_PTR)(l)) >> 16) & 0xffff))
#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define HIBYTE(w) ((BYTE)((((DWORD_PTR)(w)) >> 8) & 0xff))
可以位元組寫段簡單的測驗程式對比下
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/263087.html
標籤:基礎類
