久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1660|回復: 0
打印 上一主題 下一主題
收起左側

modbus協議上位機通用接口

[復制鏈接]
跳轉到指定樓層
樓主
ID:385629 發表于 2018-8-13 08:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. public class KModbusUnity
  2.     {
  3.         static ushort POLYNOMIAL = 0xA001;
  4.         /// <summary>
  5.         /// 計算CRC校驗結果
  6.         /// </summary>
  7.         /// <param name="data">數據源</param>
  8.         /// <returns>校驗結果</returns>
  9.         public static byte[] CRCCheck(byte[] data )
  10.         {
  11.             ushort crc = 0xffff;
  12.             for(ushort i=0;i<data.Length;i++)
  13.             {
  14.                 crc ^= (ushort)(data[i] & 0x00FF);
  15.                 for(ushort j = 0;j<8;j++)
  16.                 {
  17.                     if ((crc & 0x0001) != 0)
  18.                     {
  19.                         crc >>= 1;
  20.                         crc ^= POLYNOMIAL;
  21.                     }
  22.                     else
  23.                         crc >>= 1;
  24.                 }
  25.             }

  26.             return System.BitConverter.GetBytes(crc);
  27.         }
  28.         /// <summary>
  29.         /// 收到的數據有效
  30.         /// </summary>
  31.         /// <param name="data">數據</param>
  32.         /// <returns></returns>
  33.         public static bool IsValid(byte[] data)
  34.         {
  35.             bool bReturn = false;
  36.             int n = data.Length;
  37.             if (n >= 4)
  38.             {
  39.                 byte[] check = new byte[n - 2];
  40.                 for (int j = 0; j < n - 2; j++)
  41.                 {
  42.                     check[j] = data[j];
  43.                 }
  44.                 // 校驗結果
  45.                 byte[] crc = KModbusUnity.CRCCheck(check);
  46.                 if (crc[0] == data[n - 2] && crc[1] == data[n - 1])
  47.                 {
  48.                     bReturn = true;
  49.                 }
  50.             }
  51.             return bReturn;
  52.         }
  53.         /// <summary>
  54.         /// 返回帶校驗碼的數據
  55.         /// </summary>
  56.         /// <param name="data">源數據</param>
  57.         /// <returns>帶校驗碼的數據</returns>
  58.         public static byte[] CRCData(byte[] data)
  59.         {
  60.             byte[] crcCheck = CRCCheck(data);
  61.             byte[] rdata = new byte[data.Length + 2];

  62.             data.CopyTo(rdata, 0);
  63.             crcCheck.CopyTo(rdata, data.Length);

  64.             return rdata;
  65.         }

  66.         public static byte[] CRCData(String hex)
  67.         {
  68.             return CRCData(HexStrToBytes(hex));
  69.         }
  70.         /// <summary>
  71.         /// 16進制字符串轉byte數組
  72.         /// </summary>
  73.         /// <param name="hex">16進制的字符串,可以是空格隔開的方式</param>
  74.         /// <returns>byte數組</returns>
  75.         public static byte[] HexStrToBytes(String hex)
  76.         {
  77.             hex = hex.Replace(" ", "");
  78.             if ((hex.Length % 2) != 0)
  79.                 hex += " ";
  80.             byte[] returnBytes = new byte[hex.Length / 2];
  81.             for (int i = 0; i < returnBytes.Length; i++)
  82.             {
  83.                 String sub = hex.Substring(i * 2, 2);
  84.                 returnBytes[i] = Convert.ToByte(sub, 16);
  85.             }
  86.             return returnBytes;
  87.         }
  88.         /// <summary>
  89.         /// byte數組轉16進制字符串
  90.         /// </summary>
  91.         /// <param name="bytes">byte數組</param>
  92.         /// <returns>16進制字符串</returns>
  93.         public static String BytesToHexStr(byte[] bytes)
  94.         {
  95.             return BitConverter.ToString(bytes).Replace('-', ' ').Trim();
  96.         }
  97.         /// <summary>
  98.         /// byte轉float
  99.         /// </summary>
  100.         /// <param name="data">byte</param>
  101.         /// <param name="nStart">開始位置</param>
  102.         /// <returns>float</returns>
  103.         public static float BytesToFloat(byte[] data ,int nStart = 0)
  104.         {
  105.             float fResult = 0;
  106.             
  107.             fResult = BitConverter.ToSingle(new byte[] {data[nStart+3],data[nStart+2],data[nStart+1],data[nStart] }, 0);
  108.             return fResult;
  109.         }

  110.         public static bool[] ByteToBitArray(byte data)
  111.         {
  112.             bool[] bResult = new bool[8];
  113.             for(int i =0;i<8;i++)
  114.             {
  115.                 var tmp = 1 << i;
  116.                 bool b = ((data & tmp) == tmp);
  117.                 bResult[i] = b;
  118.             }

  119.             return bResult;
  120.         }

  121.         public static byte[] StringToBytes(String str)
  122.         {
  123.             return System.Text.Encoding.ASCII.GetBytes(str);
  124.         }
  125.     }
復制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费一级片 | 免费观看的av| 亚洲欧美日韩系列 | 国产传媒在线观看 | 日韩精品一区二区三区中文在线 | 精品亚洲一区二区三区四区五区 | 日韩在线国产 | 成人av片在线观看 | 精品久久国产视频 | 日韩中文字幕一区 | 91亚洲国产成人久久精品网站 | 一级a爱片久久毛片 | 亚洲一区二区三区欧美 | 亚洲视频一区在线 | 久久国产精品无码网站 | 不卡欧美| 欧美精品在线一区 | 先锋资源吧 | 久久久精品| 成人在线观看免费 | 日本小视频网站 | 一级黄色片一级黄色片 | 久草视 | 亚洲巨乳自拍在线视频 | 国产一区91精品张津瑜 | a看片| 日韩午夜在线观看 | 欧洲一区视频 | 国产日韩一区二区三免费高清 | 日韩一区二区三区在线视频 | 天天爽夜夜操 | 久久日韩精品 | 黄色骚片| cao视频| 中文字幕人成乱码在线观看 | 日韩精品免费视频 | 成人福利视频网站 | 日屁网站 | 国产精品亚洲精品日韩已方 | 国产激情视频在线观看 | 成人免费一区二区 |