一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Modbus通訊協(xié)議學習

 bit54song 2015-06-04

 

了解了它,會使你對串口通信有一個清晰的認識!

image

通用消息幀

image

 

ASCII消息幀 (在消息中的每個8Bit 字節(jié)都作為兩個ASCII字符發(fā)送)

十六進制,ASCII字符0...9,A...F

消息中的每個ASCII字符都是一個十六進制字符組成

每個字節(jié)的位

1個起始位

n個數(shù)據(jù)位,最小的有效位先發(fā)送

1個奇偶校驗位,無校驗則無

1個停止位(有校驗時),2個Bit(無校驗時)

錯誤檢測域

LRC(縱向冗長檢測)

ASCII消息幀

位順序(ASCII)

RTU消息幀

8位二進制,十六進制數(shù)0...9,A...F

消息中的每個8位域都是一個兩個十六進制字符組成

每個字節(jié)的位

1個起始位

8個數(shù)據(jù)位,最小的有效位先發(fā)送

1個奇偶校驗位,無校驗則無

1個停止位(有校驗時),2個Bit(無校驗時)

錯誤檢測域

CRC(循環(huán)冗長檢測)

RTU消息幀

位順序(RTU)

CRC校驗 (http://baike.baidu.com/view/1664507.htm)

復制代碼
public static string CRCCheck(string val)
        {
            val = val.TrimEnd(' ');
            string[] spva = val.Split(' ');
            byte[] bufData = new byte[spva.Length + 2];
            bufData = ToBytesCRC(val);
            ushort CRC = 0xffff;
            ushort POLYNOMIAL = 0xa001;
            for (int i = 0; i < bufData.Length - 2; i++)
            {
                CRC ^= bufData[i];
                for (int j = 0; j < 8; j++)
                {
                    if ((CRC & 0x0001) != 0)
                    {
                        CRC >>= 1;
                        CRC ^= POLYNOMIAL;
                    }
                    else
                    {
                        CRC >>= 1;
                    }
                }
            }
            return Maticsoft.DBUtility.HLConvert.ToHex(System.BitConverter.GetBytes(CRC));
        }
        /// <summary>
        /// 例如把如下字符串轉(zhuǎn)換成字節(jié)數(shù)組
        /// AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB   轉(zhuǎn)換為字節(jié)數(shù)組
        /// </summary>
        /// <param name="hex">十六進制字符串</param>
        /// <returns></returns>
        public static byte[] ToBytesCRC(string hex)
        {
            string[] temp = hex.Split(' ');
            byte[] b = new byte[temp.Length + 2];

            for (int i = 0; i < temp.Length; i++)
            {
                b[i] = Convert.ToByte(temp[i], 16);
            }

            return b;
        }
        /// <summary>
        /// 將字節(jié)數(shù)據(jù)轉(zhuǎn)換為十六進制字符串,中間用 “ ”分割 如:AA AA AA AA 0A 00 68 00 06 03 04 54 21 28 22 E5 F3 16 BB BB BB BB
        /// </summary>
        /// <param name="vars">要轉(zhuǎn)換的字節(jié)數(shù)組</param>
        /// <returns></returns>
        public static String ToHex(byte[] vars)
        {
            return BitConverter.ToString(vars).Replace('-', ' ').Trim();
        }
復制代碼

CS校驗(累加和)

復制代碼
public static string CSCheck(string str)
        {
            if (str.Length == 0) return "";
            else str = str.Trim();
            byte[] sss = ToBytes(str);
            int n = 0;
            for (int i = 0; i < sss.Length; i++)
            {
                n += sss[i];
            }
            return ToHex(n);
        }
        /// <summary>
        /// AB CD 12 3B     轉(zhuǎn)換為字節(jié)數(shù)組
        /// </summary>
        /// <param name="hex">十六進制字符串</param>
        /// <returns></returns>
        public static byte[] ToBytes(string hex)
        {
            string[] temp = hex.Split(' ');
            byte[] b = new byte[temp.Length];

            for (int i = 0; i < temp.Length; i++)
            {
                if (temp[i].Length > 0)
                    b[i] = Convert.ToByte(temp[i], 16);
            }

            return b;
        }
        /// <summary>
        /// 轉(zhuǎn)換為符合本程序的十六進制格式
        /// </summary>
        /// <param name="var">1 2 3 等。</param>
        /// <returns>返回十六進制字符串,如果是1-9的話,前面帶零</returns>
        /// <example>例如: 5  ="05"  12 ="0C" 無論何時,都是兩位數(shù)。  </example>
        public static string ToHex(int var)
        {
            int cs = var;
            string tmp = "";
            if (cs == 0) { tmp = "00"; }
            while (cs > 0)
            {
                int ys;
                cs = Math.DivRem(cs, 256, out ys);
                tmp = tmp.Insert(0, string.Format(" {0}", Right("00" + Convert.ToString(ys, 16), 2).ToUpper()));
            }
            return tmp.Trim();
        }
        public static string Right(string str, int Length)
        {
            if ((Length <= 0) || (str == null))
            {
                return "";
            }
            int length = str.Length;
            if (Length >= length)
            {
                return str;
            }
            return str.Substring(length - Length, Length);
        }
復制代碼

LRC校驗(LRC錯誤校驗用于ASCII模式)

復制代碼
/// <summary>
        /// 取模FF(255)
        /// 取反+1
        /// </summary>
        /// <param name="writeUncheck"></param>
        /// <returns></returns>
        public static string LRCheck(string writeUncheck)
        {
            char[] hexArray = new char[writeUncheck.Length];
            hexArray = writeUncheck.ToCharArray();
            int decNum = 0, decNumMSB = 0, decNumLSB = 0;
            int decByte, decByteTotal = 0;

            bool msb = true;

            for (int t = 0; t <= hexArray.GetUpperBound(0); t++)
            {
                if ((hexArray[t] >= 48) && (hexArray[t] <= 57))

                    decNum = (hexArray[t] - 48);

                else if ((hexArray[t] >= 65) & (hexArray[t] <= 70))
                    decNum = 10 + (hexArray[t] - 65);

                if (msb)
                {
                    decNumMSB = decNum * 16;
                    msb = false;
                }
                else
                {
                    decNumLSB = decNum;
                    msb = true;
                }
                if (msb)
                {
                    decByte = decNumMSB + decNumLSB;
                    decByteTotal += decByte;
                }
            }

            decByteTotal = (255 - decByteTotal) + 1;
            decByteTotal = decByteTotal & 255;

            int a, b = 0;

            string hexByte = "", hexTotal = "";
            double i;

            for (i = 0; decByteTotal > 0; i++)
            {
                b = Convert.ToInt32(System.Math.Pow(16.0, i));
                a = decByteTotal % 16;
                decByteTotal /= 16;
                if (a <= 9)
                    hexByte = a.ToString();
                else
                {
                    switch (a)
                    {
                        case 10:
                            hexByte = "A";
                            break;
                        case 11:
                            hexByte = "B";
                            break;
                        case 12:
                            hexByte = "C";
                            break;
                        case 13:
                            hexByte = "D";
                            break;
                        case 14:
                            hexByte = "E";
                            break;
                        case 15:
                            hexByte = "F";
                            break;
                    }
                }
                hexTotal = String.Concat(hexByte, hexTotal);
            }
            return hexTotal;
        }

        public void LRCheck(byte[] code)
        {
            int sum = 0;
            foreach (byte b in code)
            {
                sum += b;
            }
            sum = sum % 255;//取模FF(255)
            sum = ~sum + 1;//取反+1
            string lrc = Convert.ToString(sum, 16);
            return lrc;
        }
復制代碼

 

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    欧美日韩黑人免费观看| 国产成人精品视频一二区| 欧美中文字幕一区在线| 日韩免费国产91在线| 欧美日韩人妻中文一区二区| 一区二区三区欧美高清| 亚洲少妇一区二区三区懂色| 99久久婷婷国产亚洲综合精品| 欧美一区二区在线日韩| 大香蕉久草网一区二区三区| 91人妻久久精品一区二区三区| 尹人大香蕉一级片免费看| 香蕉尹人视频在线精品| 国产美女精品午夜福利视频| 精品国产亚洲av成人一区| 精品日韩欧美一区久久| 亚洲高清中文字幕一区二三区| 国产专区亚洲专区久久| 婷婷色网视频在线播放| 黄色污污在线免费观看| 亚洲中文字幕有码在线观看| 人妻少妇av中文字幕乱码高清| 老司机精品国产在线视频| 国产一级片内射视频免费播放| 午夜福利国产精品不卡| 办公室丝袜高跟秘书国产| 九九热精品视频免费观看| 小草少妇视频免费看视频| 久久精品亚洲欧美日韩| 欧美日韩在线第一页日韩| 日本午夜精品视频在线观看| 97人妻精品免费一区二区| 少妇熟女精品一区二区三区| 在线免费国产一区二区三区| 日木乱偷人妻中文字幕在线| 日韩不卡一区二区视频| 丰满熟女少妇一区二区三区| 国产日韩欧美一区二区| 欧美日韩国产自拍亚洲| 麻豆精品视频一二三区| 亚洲欧美日产综合在线网|