精华内容
下载资源
问答
  • 校验序列FCS

    2010-09-10 22:32:00
    在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列FCS就是其中的一种。 帧校验序列FCS ( Frame Check Sequences)是为提高通信的可靠性...

       在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列码FCS就是其中的一种。

       帧校验序列码FCS ( Frame Check Sequences)是为提高通信的可靠性设置的。将每一帧中的第一个字符@到该帧中正文的最后一个ASCII 字符作“异或”运算, 并将异或的结果转换为两个ASCII码, 便得到了FCS , 它作为帧的一部分发送到接收端。接收端计算出收到的帧的FCS , 如果与发送端传送过来的FCS 不同, 可以判定通信有误。

       由于近段一直在做上位机与PLC有关的通信,了解了一些版本语言的FCS算法,在此提供一些代码供大家交流学习。

    首先是VB写的FCS校验:

    Function fcs(ByVal inputstr As String) As String
    Dim slen, i, xorresult As Integer
    Dim tempfes As String
    slen = Len(inputstr) '求输入字符串长度
    xorresult = 0
    For i = 1 To slen
    xorresult = xorresult Xor Asc(Mid$(inputstr, i, 1))     '按位异或
    Next i
    tempfes = Hex$(xorresult) '转化为16进制
    If Len(tempfes) = 1 Then tempfes = "0" + tempfes
    fcs = tempfes
    End Function   
    

     

    由于我们的项目是c#写的,把VB版本的修改成c#了,代码如下:

            static string fcs(string data)
            {
                int xorresult = 0;
                string tempfes = "";
                for (int i = 0; i < data.Length; i++)
                {
                    xorresult = xorresult ^ Convert.ToInt32(data[i]);
                }
                tempfes = Convert.ToString(xorresult, 16);
                if (tempfes.Length == 1)
                {
                    tempfes = "0" + tempfes;
                }
                return tempfes;
            }
    

     

     

    转载于:https://www.cnblogs.com/lovetsfuer/archive/2010/09/10/1823661.html

    展开全文
  • C#学习之帧校验序列FCS

    千次阅读 2017-04-24 09:38:18
    在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列FCS就是其中的一种。  帧校验序列FCS ( Frame Check Sequences)是为提高通信的可靠性...

      在上位机与PLC通信中,为了更好的校验发送与接收的数据的准确性,一般都会加一位校验位,校验码的算法有多种,帧校验序列码FCS就是其中的一种。


       帧校验序列码FCS ( Frame Check Sequences)是为提高通信的可靠性设置的。将每一帧中的第一个字符@到该帧中正文的最后一个ASCII 字符作“异或”运算(这里可能这样说更容易理解:从每一帧的第二位开始(第一位就是原始值),将后一位与前一位的异或值进行异或运算,得到的异或值就是异或结果), 并将异或的结果转换为两个ASCII码, 便得到了FCS , 它作为帧的一部分发送到接收端。接收端计算出收到的帧的FCS , 如果与发送端传送过来的FCS 不同, 可以判定通信有误。

       由于近段一直在做上位机与PLC有关的通信,了解了一种FCS算法,在此提供代码供大家交流学习:

       public static string tobcc(string s)  //帧校验函数FCS

            {

                //获取s对应的字节数组
                byte[] b = Encoding.ASCII.GetBytes(s);
                // xorResult 存放校验结果。注意:初值去首元素值!
                byte xorResult = b[0];
                // 求xor校验和。注意:XOR运算从第二元素开始
                for (int i = 1; i < b.Length; i++)
                {
                    //**进行异或运算,^=就是异或运算符,具体可查阅异或运算
                    //**异或运算:两个二进制数的每一位进行比较,如果相同则为0,不同则为1,如下面2个10进制数37、     48的二进制值异或结果为21
                    //**  37(10)       100101(2)
                    //**  48(10)       110000(2)
                    //**  21(10)       010101(2)
                    //**这里的意思是:如a^=b,就是a与b先进行异或比较,得出的结果赋值给a;
                    xorResult ^= b[i];             
                }
                //**Convert.ToString(xorResult, 16):将当前值转换为16进制;ToUpper():结果大写;
                //**这里的意思是:将xorResult转换成16进制并大写;

               //**(//**返回的结果为一个两个ASCII码的异或值
                return Convert.ToString(xorResult, 16).ToUpper();

             }   

          (注:1、本案例是C#与松下PLC通信,采用TCP/IP通信方式;

              2、松下通信协议可查看MEWTOCOL)

    展开全文
  • /*FCS检验序列*/ int FCS ( int D , int G ) { int Dw ; /*D的位数*/ const int Gw = log ( G ) / log ( 2 ) + 1 ; /*计算G的位数,是定值*/ int temp ; /*中间变量*/ int...

    循环冗余检测(Cyelie Redundancy Check)

    CRC编码也称为多项式编码。

    CRC编码操作如下。考虑d比特的数据D,发送节点要将它发送给接收节点。发送方和接收方必须首先协商一个r+1比特模式,称为生成多项式,我们将其表示为G。

    我们将要求G的最高有效位的比特是1,CRC编码的关键思想如图所示,对于一个给定的数据D,发送方要选择r个附加比特R,并将它们附加到D上,使得得到的d+r比特模式用模二算术恰好能被其整除,用CRC进行差错检测的过程,因此很简单,接收方用G去除接收到的d+r比特,如果余数为非零,接收方知道出现了差错,否则认为数据正确而被接受

    d比特 r比特
    D: 被发送的数据比特 R: CRC比特

    在这里插入图片描述
    C++实现计算FCS的代码:

    #include <iostream>
    #include <cmath>
    #include <bitset>
    
    using namespace std;
    
    /*FCS检验序列*/
    int FCS(int D, int G)
    {
    	int Dw;                           /*D的位数*/
    	const int Gw= log(G) / log(2) + 1;/*计算G的位数,是定值*/
    	int temp;                         /*中间变量*/
    	int mask;                         /*掩码*/
    	D = D * pow(2, Gw-1);             /*把D右移的长度减一位*/
    	while (D > G)
    	{
    		Dw = log(D) / log(2)+1;       /*计算D的位数*/
    		temp = D >> (Dw - Gw);        /*取出D的前Gw位,以便与G进行异或运算*/
    		temp = temp ^ G;              /*异或*/
    		mask = pow(2, Dw - Gw) - 1;   
    		D = D & mask;                 /*把D的前Gw为去掉*/
    		temp = temp << (Dw - Gw);     
    		D = D + temp;                 /*更新D的值*/
    	}
    	return temp;
    }
    
    int main()
    {
    	int D = 0b101110;
    	int G = 0b1001;
    
    	cout<< bitset<3>(FCS(D,G)) << endl;
    
    	system("pause");
    
    }
    

    代码运行结果
    在这里插入图片描述
    参考书籍:《计算机网络自顶向下方法》

    展开全文
  • 本文依据HDLC规程的原始定义给出了HDLC帧校验序列FCS的计算方法及硬件实现系统码字编码的方案。根据文中给出的方法所做的计算与RUP1-44系列单片机串行接口单元SIU实际发送与接收的数据流进行了比较,经检验,实验...
  • python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)帧检验序列FCS 想弄明白这里要看多几遍,配合下面的例子能更快理解。 第一、CRC-16校验码计算方法: 常用查表法和计算法。计算方法一般都是: (1)、预置1个...

    python crc-16 crc-16校验码 crc-16校验算法 ppp(MAC)帧检验序列FCS

    想弄明白这里要看多几遍,配合下面的例子能更快理解。

    第一、CRC-16校验码计算方法:
    常用查表法和计算法。计算方法一般都是:
    (1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;
    (2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
    8位相异或,把结果放于CRC寄存器,高八位数据不变;
    (3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
    (4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多
    项式A001(1010 0000 0000 0001)进行异或;
    (5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
    (6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
    (7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低
    字节进行交换;
    (8)、最后得到的CRC寄存器内容即为:CRC码。
    以上计算步骤中的多项式A001是8005按位颠倒后的结果。

    8005(1000 0000 0000 0101)二进制旋转180度(按位颠倒)即为A001(1010 0000 0000 0001)
    因为这是被除数右移,左移的话不用颠倒为8005。(相对来说就是除数左移颠倒,右移不用颠倒为8005)
    除数也就是生成多项式,是有标准的。
    在这里插入图片描述为什么要设置crc寄存器初始值为FFFF?因为某些数据在前面加0但结果不变,所以加了点改动,CRC-16具体细分也有不同标准,就是CRC寄存器初始值,结果异或值,高低位在前在后不同等等。
    在这里插入图片描述
    我们这用MODBUS
    在这里插入图片描述

    前8位不动,后8位和传过来的数据的两位16进制数异或成新的crc值。
    右移两位,因为移一位移出去的是0,第二位是1,然后异或
    在这里插入图片描述
    只要移出去的是0就继续移,直到是有个1移出去。下面是完整过程
    在这里插入图片描述

    移动8位结束,重新下一轮,结束时的crc值作为新一轮的初始值,下两位16进制数为:00
    在这里插入图片描述在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    结果为F807
    接下来是Python写的代码,这里是直接求值法,另外一种是查表法。

    def calc_crc(string):
        data = bytearray.fromhex(string)
        crc = 0xFFFF#初始值
        for pos in data:
            crc ^= pos#每次两位16进制和crc低8位异或
            for i in range(8):#右移八次
                if ((crc & 1) != 0):#如果移出去的不是0(即移出去的是1)则右移1位且和A001异或。否则为0直接右移1位不作其他处理
                    crc >>= 1
                    crc ^= 0xA001
                else:
                    crc >>= 1
        return hex(((crc & 0xff) << 8) + (crc >> 8))[2:]#高低8位对调。
    
    
    crc = calc_crc('3D00030007')
    print('crc:'+crc)
    

    在这里插入图片描述
    bytearray.fromhex(string)不好说,可以看下面两个链接自行体会。简单来说就是把传进来的16进制数string转化为数组,每两位16进制数作为一组数据,有些似乎因为ASCII码超出范围而不能用\x表示,用其ASCII值对应的字符表示,它们实际值是一样的。
    crc ^= pos 即 crc= crc ^ pos 异或运算
    crc >>= 1 即 crc = crc >>1 右移1位
    if ((crc & 1) != 0): & 在Python里(如果是数值的话)是位运算,都是1则为1,其他情况为0。crc & 1其实是crc & 0000 0001。crc末位为1则为1,意为移出去的是1;crc末位为0则为0,意为移出去的是0
    最后一行hex(((crc & 0xff) << 8) + (crc >> 8))[2:]
    [2:]意为选取结果的第2位到最后,从0开始,不写则结果为0x…
    hex()返回16进制数
    (crc & 0xff) << 8) 和0000 0000 1111 1111 并运算,高8位结果为0,低八位为原值,再左移8位。
    结果由原来的0000 0000 xxxx xxxx变为xxxx xxxx 0000 0000
    (crc >> 8) 右移8位,高八位变低八位,高八位可看成自动补0。
    结果由原来的xxxx xxxx xxxx xxxx变为0000 0000 xxxx xxxx
    相加得高低八位互换的效果。

    Python标准库中关于bytearray.fromhex(string)的疑问
    bytes的hex和fromhex函数

    参考:
    怎么计算crc16校验数据的校验码
    循环冗余校验CRC算法
    Python计算CRC16

    展开全文
  • 我们知道在以太网帧的末尾有一个叫FCS的东西。 全称:Frame Check Sequence,中文名:帧检验序列 这个东西是用来检验我们的数据是否在传输的过程中被破坏(不一定是收到攻击,也可能是一些物理干扰),以更好的安排...
  • 校验序列

    2011-12-07 22:51:09
    校验序列详细说明,FCS,网络常校验方式。
  • 帧检验序列(FCS)

    千次阅读 2019-11-27 13:32:26
    在数据链路层要解决数据传输的三个问题: 封装成帧 ...帧校验序列FCS)是指特别的检测码字符被添加到在一个通信协议中的帧中进行检错和纠错。发送主机在整个帧中有一个检测码随着发送。接收主机...
  • 本研究对FCS的几种主要实现方式及其检错性能进行了数学分析及研究。并对数据比特长度与检验比特长度的关系进行了讨论。
  • 帧检测序列错误(FCS

    千次阅读 2014-05-19 15:08:07
    校验序列FCS)是指特别的检测码字符被添加到在一个通信协议中的帧中进行检错和纠错。发送主机在整个帧中有一个检测码随着发送。接收主机在整个帧中的检测码使用相同的运算法则,并将它与接收到的 FCS 相比较。...
  • CRC 循环冗余校验

    2017-07-02 12:14:26
    在mac帧中,将原始数据处于除数(生成多项式)把得到的余数叫做FCS(帧校验序列FCS)加到mac帧的尾部。CRC 算法的基本思想是将传输的数据当做一个位数很长的数。将这个数除以另一个数。得到的余数作为校验数据附加到...
  • 计算M'/P的余数R(帧校验序列FCS); 发送帧:M’+FCS 计算余数的二进制除法(异或) 第一步:要在数据位(被除数)后边补 0 , 0 的个数比除数(生成多项式)少一位。 第二步:做除法(异或操作),从被除数的头五位.....
  • FCS是什么?

    万次阅读 2019-09-07 11:43:52
    FCS (帧校验序列(帧尾)) FCS:Frame Check Sequence(帧校验序列),俗称帧尾,即计算机网络数据链路层的协议数据单元(帧)的尾部字段,是一段4个字节的循环冗余校验码。 源节点发送数据帧时,由帧的帧头和数据...
  • CRC校验算法

    千次阅读 2017-03-02 18:11:35
    基本原理及概念CRC校验算法是在通信方面常用的一种差错检测的手段。原理是在将原始帧数据发送之前,...我们将上面所述的k位校验序列称为帧检验序列FCS。 特定运算为多项式模2运算。(我更喜欢将它理解为异或运算)CRC
  • 1、广域网数据链路传输控制规程 标志字段F 地址字段A 控制字段C 信息字段INFO 帧校验序列FCS 标志字段F 1Byte 1Byte 1Byte 可变长度 2Byte 1Byte 标志字段F ...
  • CRC校验

    2017-07-11 09:50:43
    CRC校验是什么? 如何进行校验? 具体的例子? CRC校验 为了保证数据传输的可靠性,在... 先在要发送的帧后面附加一个数(这个数就是用来校验校验FCS,这个校验码是二进制序列的),生成一个新帧发送给接收端。
  • 第六周内容

    2019-04-02 22:57:00
    1.数据链层 广域网数据链路控制规程的分类 以字符作为传输基本单位 面向比特型传输规程 ...帧结构: 标志字符F 地址字段A 控制字段C 信息字段INFO 帧校验序列FCS 标志字段F 1Byte 1Byte ...
  • 2018 4.1 IP通信基础

    2019-04-01 19:45:00
    一、广域网数据链路控制规程的分类: 1、面向字符型:以字符为传输单位 典型例子:BSC、DDCMP 2、面向比特型:以比特为传输...帧结构: 标志字符F 地址字段A 控制字段C 信息字段INFO 帧校验序列FCS 标志字段F ...
  • 网络基本概念

    2018-06-22 20:10:10
    1. 64字节小包是指:目的MAC地址(6字节)+源MAC地址(6字节)+长度或协议类型(2字节)+数据(以太网最少为46字节或802.3最少为64字节)+帧校验序列FCS(4字节)=64字节之所以最小为64字节是因为:小于64个字节的认为是碰撞。...
  •  MAC帧的数据格式: head包含:(固定18个字节)  发送者(源地址,6个字节)  接收者(目标地址,6个字节)  数据类型(6个字节)=类型2字节+帧校验序列FCS(CRC检验)4字节 data包含:(最短46字节,最长...
  • 标志字段F|地址字段A|控制字段C|信息字段INO|帧校验序列FCS|标志字段F 头层各加有24bit的控制信息,误码率不能降到0 ←802.3MAC→|←802.2LLC→|←802.2SNAP→| 目的地址 源地址 长度 DSAP SSAP CNTL O...
  • 以太网中的MAC帧格式

    2019-10-04 18:21:40
    以太网中的MAC帧的格式为:...数据字段长度长度(2字节):指示其后的逻辑链路控制(LLC)数据字节的长度逻辑链路控制帧LLC:携带的用户数据填充字段PAD:以保证帧有足够长度来适应碰撞检测的需要帧校验序列FCS(4...

空空如也

空空如也

1 2 3 4 5 6
收藏数 116
精华内容 46
关键字:

校验序列fcs