您的位置:首页 > 编程语言 > C#

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

2012-01-01 10:38 555 查看
若所求校验为两位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];
                }
            }
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: