代码改变世界

帧校验序列码FCS

2010-09-10 22:32  Daniel Xu  阅读(8162)  评论(0编辑  收藏  举报

   在上位机与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;
        }