zoukankan      html  css  js  c++  java
  • 串口校验

    转自串口校验


    下位机通过串口将数据传送给上位机,为了保证数据的正确往往需要进行校验,在传送一个字节的时候可以进行奇偶校验,传送一组数据的时候可以采用CRC校验等,但是在发送一组数据的时候采用CRC校验单片机往往太占资源,这就需要有一种比较简单的校验方法。

    可以采用类似于IP校验的方式,当发送IP包时,IP报头的校验和为:
    1、把校验和字段置为0;
    2、对IP头部中的每16bit进行二进制求和;
    3、如果和的高16bit不为0,则将和的高16bit和低16bit反复相加,直到和的高16bit为0,从而获得一个16bit的值;
    4、将该16bit的值取反,存入校验和字段。
    当接收IP包时,需要对报头进行确认,检查IP头是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。
    实例:
    IP头:  
                  45 00    00 31
                  89 F5    00 00
                  6E 06    00 00(校验字段)
                  DE B7   45 5D       ->    222.183.69.93
                  C0 A8   00 DC     ->    192.168.0.220
    计算:   
        4500 + 0031 +89F5 + 0000 + 6e06+ 0000 + DEB7 + 455D + C0A8 + 00DC =3 22C4
        0003 + 22C4 = 22C7
         ~22C7 = DD38      ->即为应填充的校验和
    当接受到IP数据包时,要检查IP头是否正确,则对IP头进行检验,方法同上:
    计算:
        4500 + 0031 +89F5 + 0000 + 6E06+ DD38 + DEB7 + 455D + C0A8 + 00DC =3 FFFC
        0003 + FFFC = FFFF
         ~FFFF = 00000     ->正确
    TCP首部检验和与IP首部校验和的计算方法相同,在程序中使用同一个函数来计算。
    在下位机中,如果是8位单片机,则校验变成了
    1、把校验和字段置为0;
    2、对要传输的数组每8bit进行二进制求和;
    3、如果和的高8bit不为0,则将和的高8bit和低8bit反复相加,直到和的高8bit为0,从而获得一个8bit的值;
    4、将该8bit的值取反,存入校验和字段。
    当接收数据时,对校验和进行确认,检查是否有误,算法同上2、3步,然后判断取反的结果是否为0,是则正确,否则有错。

    C程序为
    unsigned char checksum(unsigned char *s,unsigned char n)
    {
     unsigned int check = 0;
     unsigned char i, ch = 0;
     for(i=0;i<n;i++)
     {
      check += *s++; 
     }
     check = (check>>8) + (check&0xff);    //高八位+低八位
     check += (check>>8);       //为防止进位,再加一次 
     
     ch = check&0x00ff;
     return ~ch;
    }




  • 相关阅读:
    Longest Palindromic Substring
    PayPal MLSE job description
    Continuous Median
    Remove Duplicates From Linked List
    Valid IP Address
    Longest substring without duplication
    Largest range
    Subarray sort
    Multi String Search
    Suffix Trie Construction
  • 原文地址:https://www.cnblogs.com/noble/p/4144248.html
Copyright © 2011-2022 走看看