Modbus RTU通过从站地址获取校验码的代码
主要方法
-
拆分高低位
-
计算校验码
-
完整通过从站地址获取校验码的代码
using System; class Program { static void Main() { Console.Write("请输入从站地址(十六进制): "); string slaveAddressInput = Console.ReadLine(); byte slaveAddress; while (!(byte.TryParse(slaveAddressInput, System.Globalization.NumberStyles.HexNumber, null, out slaveAddress))) { Console.Write("无效的从站地址输入,请输入有效的十六进制值: "); slaveAddressInput = Console.ReadLine(); } byte[] command1 = new byte[10]; //01 03 00 00 00 10 44 06 command1[0] = slaveAddress; command1[1] = 0x03; command1[2] = 0x00; command1[3] = 0x00; command1[4] = 0x00; command1[5] = 0x10; byte[] command2 = { command1[0], command1[1], command1[2], command1[3], command1[4], command1[5] }; byte[] crcBytes = GetCrcBytes(command2); command1[6] = crcBytes[0]; command1[7] = crcBytes[1]; Console.WriteLine(command1[6].ToString("X2")); Console.WriteLine(command1[7].ToString("X2")); } public static ushort CalculateCrc(byte[] data) { ushort crc = 0xFFFF; foreach (byte b in data) { crc ^= b; for (int i = 0; i < 8; i++) { if ((crc & 0x0001) != 0) { crc >>= 1; crc ^= 0xA001; // 这是Modbus RTU协议的生成多项式 } else { crc >>= 1; } } } return crc; } // 将CRC拆分为低位和高位 public static byte[] GetCrcBytes(byte[] data) { ushort crc = CalculateCrc(data); byte[] crcBytes = new byte[2]; crcBytes[0] = (byte)(crc & 0xFF); // 低位 crcBytes[1] = (byte)((crc >> 8) & 0xFF); // 高位 return crcBytes; } }
-
测试几个结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!