C# tcp 网口通讯

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace WindowsFormsApp2
{
     public class ModbusTCP
    {
        public Socket TcpClient = null; //声明一个socket对象
        public byte Slaved { get; set; } = 0x01;  //单元标识符(从机地址)
        /// 
        /// 建立连接
        /// 
        /// 
        public bool Connect(string ip,int port)
        {
            TcpClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //实例化socket对象
            try
            {
                TcpClient.Connect(IPAddress.Parse(ip), port);//建立连接  该方法以封装三次握手
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }
        /// 
        /// 断开连接
        /// 
        public void DisConnect()
        {
            TcpClient?.Close(); //四次挥手
        }

        public byte[] ReadOutPutRegisters(ushort start,ushort lenth)//传入起始地址和长度
        {
            #region 第一步  拼接报文
            List SendCommand = new List(); //拼接报文
            SendCommand.AddRange(new byte[] { 0x00, 0x00 });//拼接事务处理标识符
            SendCommand.AddRange(new byte[] { 0x00, 0x00 });//拼接协议标识符
            SendCommand.AddRange(new byte[] { 0x00, 0x06 });//拼接长度
            SendCommand.Add(Slaved);//拼接单元标识符
            SendCommand.Add(0x03); //拼接功能码
            byte[] temp = BitConverter.GetBytes(start);//因为无法直接将Ushort类型添加到集合,需要转换为byte
            SendCommand.AddRange(new byte[] { temp[1], temp[0] });//为避免高低字节谁在前的问题,可做调整
            temp = BitConverter.GetBytes(lenth);//因为无法直接将Ushort类型添加到集合,需要转换为byte
            SendCommand.AddRange(new byte[] { temp[1], temp[0] });//为避免高低字节谁在前的问题,可做调整
            #endregion

            #region 第二步 发送报文
            TcpClient.Send(SendCommand.ToArray()); //发送报文
            #endregion

            #region 第三步 接收报文
            int count = TcpClient.Available;//获取接收缓冲区的数据
            byte[] buffer = new byte[count];//建立接收数据的字节数组
            TcpClient.Receive(buffer, buffer.Length, SocketFlags.None);
            #endregion

            #region 第四步 验证报文
            if (buffer.Length == 9 + lenth * 2) //校验总长度
            {
                if (buffer[4] * 256 + buffer[5] == 3 + lenth * 2)//检验返回数据长度
                {
                    if (buffer[6] == Slaved && buffer[7] == 0x03)//验证从机地址和功能码
                    {
                        #region 第五步 解析报文
                        byte[] result = new byte[lenth * 2];
                        Array.Copy(buffer, 9, result, 0, lenth * 2);
                        return result;
                        #endregion

                    }
                }
            }
            #endregion
            return null;
        }

    }
}

2.界面层后台代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        ModbusTCP mp = new ModbusTCP();
        public Form1()
        {
            InitializeComponent();
            bool result= mp.Connect("127.0.0.1",502);
            if (result)
            {
                MessageBox.Show("连接成功");
                timer1.Start();  
            }
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            byte[] data =mp.ReadOutPutRegisters(0,10);
            if (data!=null&&data.Length==20)
            {
                label1.Text = (data[0] * 256 + data[1]).ToString();
                label2.Text = (data[2] * 256 + data[3]).ToString();
                label3.Text = (data[4] * 256 + data[5]).ToString();
            }
        }
    }
}

你可能感兴趣的:(C#,tcp,网口通讯,c#,tcp/ip,网络)