C#实现modbus基于ASCII的LRC校验

2019-04-14 18:40发布

若所求校验为两位ASCII码,LRC就是循环求和后,取256的模,取补码,即为所求校验码;若要四位就改变模值即可 用了两个textbox; textBox1用于字符输入 textBox2用于处理后输出 button1用于响应
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace encoding { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string original = textBox1.Text; // 从广文本框读入原始数据 // 用于测试的数据 :A0030201C8EE // 冒号为起始 // A0为设备地址 // 03为控制指令 // 02为数据长度 本测试程序只计算了第二位 // 01C8为数据 // EE为校验码 string[] buf = new string[original.Length]; for (int i = 1; i < original.Length; i++) // 将字符串的第一个字符":"省略 { buf[i-1] = original.Substring(i, 1); } int len =(int)(Convert.ToChar(buf[5]))-48; // 读取数据段长度,为ASCII码,减去48即可.用字符转十进制会更方便 // 此句未测试,用于计算两位的数据长度 int len =((int)(Convert.ToChar(buf[4]))-48)*10+((int)(Convert.ToChar(buf[5]))-48); int checksum = 0; for (int i = 0; i < original.Length - 3; i++) { checksum += (int)(Convert.ToChar(buf[i])); // 求出校验和为十进制和 } int sum = 255 - checksum % 256 + 1; // 计算校验和,LRC,ASCII校验 string hex = Convert.ToString(sum, 16).ToUpper(); // 所使用ASCII全部为大写码,共两位,原理不多讲了 string[] buff = new string[hex.Length]; // 分割最后两位的ASCII校验码,用于以后比较 for (int i = 0; i < hex.Length; i++) buff[i] = hex.Substring(i, 1); if (buff[0] != buf[6 + len * 2] || buff[1] != buf[7 + len * 2]) // 比较检验码是否正确 { textBox2.Text = "checksum error" + buf[0] + buf[1]; } else { // 如果校验和正确则显示校验和 textBox2.Text = "you checksum is ok. "; for (int i = 0; i < len; i++) { textBox2.Text += buf[i+6 + len * 2]; } } } } }