回覆列表
  • 1 # 小飛飛的小朋友

    CRC檢測

    使用RTU模式,訊息包括了一基於CRC方法的錯誤檢測域。CRC域檢測了整個訊息的內容。

    CRC域是兩個位元組,包含一16位的二進位制值。它由傳輸裝置計算後加入到訊息中。接收裝置重新計算收到

    訊息的CRC,並與接收到的CRC域中的值比較,如果兩值不同,則有誤。

    CRC是先調入一值是全“1”的16位暫存器,然後呼叫一過程將訊息中連續的8位位元組各當前暫存器中的值

    進行處理。僅每個字元中的8Bit資料對CRC有效,起始位和停止位以及奇偶校驗位均無效。

    CRC產生過程中,每個8位字元都單獨和暫存器內容相或(OR),結果向最低有效位方向移動,最高有效位

    以0填充。LSB被提取出來檢測,如果LSB為1,暫存器單獨和預置的值或一下,如果LSB為0,則不進行。整個

    過程要重複8次。在最後一位(第8位)完成後,下一個8位位元組又單獨和暫存器的當前值相或。最終暫存器中

    的值,是訊息中所有的位元組都執行之後的CRC值。

    CRC新增到訊息中時,低位元組先加入,然後高位元組。CRC簡單函式如下:

    unsignedshortCRC16(puchMsg,usDataLen)

    unsignedchar*puchMsg;/*要進行CRC校驗的訊息*/

    unsignedshortusDataLen;/*訊息中位元組數*/

    {

    unsignedcharuchCRCHi=0xFF;/*高CRC位元組初始化*/

    unsignedcharuchCRCLo=0xFF;/*低CRC位元組初始化*/

    unsigneduIndex;/*CRC迴圈中的索引*/

    while(usDataLen--)/*傳輸訊息緩衝區*/

    {

    uIndex=uchCRCHi^*puchMsgg++;/*計算CRC*/

    uchCRCHi=uchCRCLo^auchCRCHi[uIndex};

    uchCRCLo=auchCRCLo[uIndex];

    }

    return(uchCRCHi<<8|uchCRCLo);

    }

  • 中秋節和大豐收的關聯?
  • 花非花.唐白居易.帶拼音?