您当前的位置: 首页 >  c#

君子居易

暂无认证

  • 0浏览

    0关注

    210博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C# WPF上位机实现和下位机TCP通讯

君子居易 发布时间:2019-03-20 09:40:13 ,浏览量:0

下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。

界面如下:

服务端

服务端实在上篇基础上实现的。需要做如下更改:

while (true)
                          {
                              try
                              {
                                  byte[] bufferDate = new byte[1024];
                                  int realLen = pSocket.Receive(bufferDate);

                                  if (realLen 
              {
                  Socket serSocket = (Socket)s;
                  while (true)//不断接收客户端连接
                  {
                      this.Invoke(addTextDelegate, "服务正在等待客户端连接……\r\n");

                      //开始接收客户端的连接
                      //阻塞当前线程,等待客户端连接
                      //客户端连接上之后,服务端自动生成一个socket和连接的客端通信
                      Socket proxSocket = serSocket.Accept();

                      this.Invoke(addTextDelegate, "客户端连接成功!\r\n" + proxSocket.RemoteEndPoint.ToString());

                      //proxSocket.Send(Encoding.Default.GetBytes("连接成功!"));

                      socketList.Add(proxSocket);//当前通信的socket放到集合中

                      new Thread(p =>
                      {
                          Socket pSocket = (Socket)p;
                          while (true)
                          {
                              try
                              {
                                  byte[] bufferDate = new byte[1024];
                                  int realLen = pSocket.Receive(bufferDate);

                                  if (realLen 
                    {
                        while (true)
                        {
                            try
                            {
                                ReceiveByte = new byte[1024];
                                int realLen = socket.Receive(ReceiveByte);
                                ReceiveStr = Encoding.Default.GetString(ReceiveByte, 0, realLen);
                                ReceiveEvent();
                                if (realLen  0&&IsConnected)
            {
                if (socket != null && socket.Connected)
                {
                    try
                    {
                        socket.Send(sendMsg);
                        return true;
                    }
                    catch (Exception ex)
                    {
                        IsConnected = false;
                        Log.WriteLog("发送数据失败,目标地址" + TagetIPEP.Address, ex);
                    }
                }
            }

            return false;

        }

 关闭方法:

public void Close()
        {
            if (socket != null && socket.Connected)
            {
                IsConnected = false;
                recListenThread.Abort();
                Log.WriteLog("关闭连接!");
                socket.Shutdown(SocketShutdown.Both);
                socket.Close();
            }
        }

在出现异常时调用

消息接收事件:

 public event Action ReceiveEvent;

每次接收消息时触发,获取属性ReceiveStr和ReceiveByte的值,刷新UI界面。

完整代码:

public class TCPClient
    {
        public TCPClient(/*IPEndPoint localIPEP,*/IPEndPoint targetIPEP)
        {
            //socket.Bind(localIPEP);
            TagetIPEP = targetIPEP;
           
        }

        public readonly IPEndPoint TagetIPEP;

        public bool IsConnected { get; set; www.meiwanyule.cn} = false;

        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { /*ReceiveTimeout=1000,SendTimeout=1000*/};

        public bool Connect(www.sanxinyulevip.com)
        {
            try
            {
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    //ReceiveTimeout = 1000,
                    //SendTimeout=1000
                };

                //IAsyncResult connResult = socket.BeginConnect(TagetIPEP.Address, TagetIPEP.Port, null, null);
                //connResult.AsyncWaitHandle.WaitOne(5000, true);
                //if (connResult.IsCompleted)
                //{
                socket.Connect(TagetIPEP.Address, TagetIPEP.Port);
                IsConnected = true;
                    //开启接收监听

                    recListenThread = new Thread((www.yongshi123.cn) =>
                    {
                        while (true)
                        {
                            try
                            {
                                ReceiveByte = new byte[1024];
                                int realLen = socket.Receive(ReceiveByte);
                                ReceiveStr = Encoding.Default.GetString(ReceiveByte, 0, realLen);
                                ReceiveEvent();
                                if (realLen  0&&IsConnected)
            {
                if (socket != null && socket.Connected)
                {
                    try
                    {
                        socket.Send(www.xintiandiyule1.com sendMsg);
                        return true;
                    }
                    catch (www.ysyl157.com  Exception ex)
                    {
                        IsConnected = false;
                        Log.WriteLog("发送数据失败,目标地址" + TagetIPEP.Address, ex);
                    }
                }
            }

            return false;

        }

        public event Action ReceiveEvent;

        public string ReceiveStr { get; set; }

        public byte[] ReceiveByte {www.dasheng178.com get; set; }

        public void Close()
        {
            if (socket != null && socket.Connected)
            {
                IsConnected = false;
                recListenThread.Abort();
                Log.WriteLog("关闭连接!");
                socket.Shutdown(SocketShutdown.Both);
                socket.Close(www.qcaphb.com/);
            }
        }

        private Thread recListenThread;

    }

 前台调用,声明Timer定时器,每个一秒触发一次。触发事件如下:

private string flag = "";
        private void QueryTimer_Elapsed(object sender,www.ysgj1688.com System.Timers.ElapsedEventArgs e)
        {
            Now = DateTime.Now;

            if (!tcp.Send("MEAS:VOLTage:ALL?\n"))
            {
                queryTimer.Enabled =www.baishenyvip.com false;
                StartContent = "开始";
                ConnContent = "连接";
                tcp.IsConnected = false;
                MessageBox.Show("查询失败!");
                return;
            }
            flag = "V";
            Thread.Sleep(50);

            if (!tcp.Send("MEAS:CURR:ALL?\n"))
            {
                queryTimer.Enabled www.365soke.com= false;
                StartContent = "开始";
                ConnContent = "连接";
                tcp.IsConnected = false;
                MessageBox.Show("查询失败!");
                return;
            }
            flag = "C";

            #region 测试
            //angle += 18;
            //if (angle > 360)
            //{
            //    angle = 18;
            //}

            #endregion

        }

 刷新UI界面的事件如下:

private void Tcp_ReceiveEvent()
        {
            Task.Run(() =>
            {
                Application.Current.Dispatcher.Invoke((www.fengshen157.com) =>
                {
                    RemoteIP = tcp.TagetIPEP.ToString();
                    switch (flag)
                    {
                        case "V":
                            VoltValue = Math.Round(Convert.ToDouble(tcp.ReceiveStr.Split(',')[0]), 3);
                            break;
                        case "C":
                            CurrentValue = Math.Round(Convert.ToDouble(tcp.ReceiveStr.Split(',')[0]), 3);
                            break;
                        default:
                            break;
                    }

                    #region 测试
                    //VoltValue = Math.Round(Math.Sin((angle) * pi / 180) * 16 + 16, 3);
                    //CurrentValue =www.yongshiyule178.com Math.Round(Math.Sin((angle) * pi / 180) * 2.5 + 2.5, 3);
                    #endregion

                    VoltValues.Add(VoltValue);
                    CurrentValues.Add(CurrentValue);

                    if (VoltValues.Count > 30)
                    {
                        VoltValues.RemoveAt(0);
                        CurrentValues.RemoveAt(0);
                    }
                });
            });
        }

 

原文地址: https://my.oschina.net/u/3386278/blog/3024823 

关注
打赏
1660814979
查看更多评论
立即登录/注册

微信扫码登录

0.0377s