C#上位机 ModbusRTU 03功能码

本文详细介绍了如何使用C#进行ModbusRTU通信,重点讲解了03功能码的实现过程,包括建立串口连接、发送请求、解析响应等关键步骤,为C#上位机开发提供了实用的参考。
摘要由CSDN通过智能技术生成
ModbusRTU.cs
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace thinger.ModebusLib
{
   
    public class ModbusRTU
    {
   
        // 连接
        // 断开
        // 读取
        // 写入

        // 字段
        // 属性
        // 方法

        private SerialPort seriaPort=new SerialPort();
        /// <summary>
        /// 建立串口连接
        /// </summary>
        /// <param name="portName"></param> 端口号
        /// <param name="baudRate"></param> 波特率
        /// <param name="parity"></param>   None
        /// <param name="dataBits"></param> 8
        /// <param name="stopBits"></param> 1
        /// <returns></returns>
        public bool Connect(string portName,int baudRate, Parity parity,int dataBits,StopBits stopBits
            )
        {
   
            seriaPort.PortName = portName;
            seriaPort.BaudRate = baudRate;
            seriaPort.Parity = parity;
            seriaPort.DataBits = dataBits;
            seriaPort.StopBits = stopBits;

            try
            {
   
                seriaPort.Open();
            }
            catch(Exception)
            {
   
                return false;
            }
            return true;
        }
        /// <summary>
        /// 断开串口连接
        /// </summary>
        public void DisConnect()
        {
   
            if(seriaPort.IsOpen)
            {
   
                seriaPort.Close();
            }
        }
        public byte[] ReadOutputRegisters(byte slaved,ushort start,ushort count)
        {
   
            //通讯方法五步
            //拼接报文
            List<byte> Sendcommand = new List<byte>();
            Sendcommand.Add(slaved);
            Sendcommand.Add(0x03);//功能码 0x03 读取输出寄存器
            /*
             *“256” 这个数字可以看出,这里的高8位就是2字节二进制的高8位,也可以是16进制的高位字节。 
             * 这里所说的“高8位”转换成10进制的数,也是从0~255 。
             * 一个2字节的数比如0x00ff ,低8位是1111 1111(2进制)或0xff(16进制)转换成10进制就是255 。 
             * 如果再加1,=0x0100,高8位是1,低8位是0 。很明显,高8位的这个“1” ,就是代表的256 。
             */
            //将ushort转byte类型
            Sendcommand.Add((byte)(start / 256));//高8位
            Sendcommand.Add((byte)(start % 256));//低8位
            //Sendcommand.Add((byte)(start >> 8));//高位
            //Sendcommand.Add((byte)(start&0xff));//低位


            Sendcommand.Add((byte)(count / 256));
            Sendcommand.Add((byte)(count % 256));

            byte[] crc = CalculateCRC(Sendcommand.ToArray(), Sendcommand.Count);
            Sendcommand.AddRange(crc);
            //发送
            seriaPort.Write(Sendcommand.ToArray(), 0, Sendcommand.Count);
            //接收
            Thread.Sleep(50);
            int lengh = seriaPort.BytesToRead;
            byte[] buffer=new byte[lengh];
            seriaPort.Read(buffer, 0, lengh);
            //验证

            if (CheckCRC(buffer))
            {
   
                byte[] result = new byte[count * 2];
                Array.Copy(buffer,3,result,0,count*2);
                return result;
            }
            else
            {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值