欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    這篇文章主要介紹了C# WPF上位機實現和下位機TCP通訊的方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

    下位機使用北京大華程控電源-1,上位機使用WPF。實現了電壓電流實時采集,曲線顯示。上午在公司調試成功,手頭沒有程控電源,使用TCP服務端模擬。昨天寫的TCP服務端正好排上用場。

    界面如下:

    服務端

    服務端實在上篇基礎上實現的。需要做如下更改:

    while (true)
                 {
                   try
                   {
                     byte[] bufferDate = new byte[1024];
                     int realLen = pSocket.Receive(bufferDate);
                     if (realLen <= 0)
                     {
                       this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "退出\r\n");
                       socketList.Remove(pSocket);
                       //客戶端退出的時候會發送一個空字節
                       pSocket.Shutdown(SocketShutdown.Both);
                       pSocket.Close();
                       return;
                     }
                     string receiveStr = Encoding.Default.GetString(bufferDate, 0, realLen);
                     switch (receiveStr)
                     {
                       case "MEAS:VOLTage:ALL?\n":
                         proxSocket.Send(Encoding.Default.GetBytes(r.Next(16,25).ToString()+ ","+r.Next(16, 25).ToString()+","+ r.Next(16, 25).ToString()));
                         break;
                       case "MEAS:CURR:ALL?\n":
                         proxSocket.Send(Encoding.Default.GetBytes(r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString()));
                         break;
                       default:
                         break;
                     }
                     this.Invoke(addTextDelegate, receiveStr + "from" + pSocket.RemoteEndPoint.ToString() + "\r\n");
                   }
                   catch (Exception ex)
                   {
                     this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "異常退出\r\n");
                     socketList.Remove(pSocket);
                     pSocket.Shutdown(SocketShutdown.Both);
                     pSocket.Close();
                     return;
                   }
                 }

    在While循環中加入:

     switch (receiveStr)
    {
      case "MEAS:VOLTage:ALL?\n":
      proxSocket.Send(Encoding.Default.GetBytes(r.Next(16,25).ToString()+ ","+r.Next(16, 25).ToString()+","+ r.Next(16, 25).ToString()));
      break;
      case "MEAS:CURR:ALL?\n":
      proxSocket.Send(Encoding.Default.GetBytes(r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString()));
      break;
      default:
      break;
    }

    模擬電源,當收到電壓查詢時,發送16~25中隨機數,由于電源是三個通道的,因此發送三個隨機數,用逗號隔開。同樣收到電流查詢,發送2~5之間的隨機數。

    完整的客戶端源碼:

    public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
          addTextDelegate = new AddTextDelegate(AddText);
        }
        private AddTextDelegate addTextDelegate;
        private List socketList = new List();
        public delegate void AddTextDelegate(string text);
        private void AddText(string text)
        {
          txtLog.Text += text;
        }
        Random r = new Random();
        private void btnStart_Click(object sender, EventArgs e)
        {
          //參數:尋址方式  傳輸數據方式 通信協議
          Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
          IPAddress iPAddress = IPAddress.Parse(txtIP.Text);
          //創建EndPoint
    

    上位詞和下位詞_c+上位機與下位機通信代碼示例_上位下位概念

    IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, int.Parse(txtPort.Text)); //綁定端口 socket.Bind(iPEndPoint); //開啟偵聽 socket.Listen(10); txtLog.Text += "服務啟動開啟偵聽……\r\n"; Thread thread = new Thread((s) => { 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 <= 0) { this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "退出\r\n"); socketList.Remove(pSocket); //客戶端退出的時候會發送一個空字節 pSocket.Shutdown(SocketShutdown.Both); pSocket.Close(); return; } string receiveStr = Encoding.Default.GetString(bufferDate, 0, realLen); switch (receiveStr) { case "MEAS:VOLTage:ALL?\n": proxSocket.Send(Encoding.Default.GetBytes(r.Next(16,25).ToString()+ ","+r.Next(16, 25).ToString()+","+ r.Next(16, 25).ToString())); break; case "MEAS:CURR:ALL?\n": proxSocket.Send(Encoding.Default.GetBytes(r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString() + "," + r.Next(2, 5).ToString())); break; default: break; } this.Invoke(addTextDelegate, receiveStr + "from" + pSocket.RemoteEndPoint.ToString() + "\r\n"); } catch (Exception ex) { this.Invoke(addTextDelegate, pSocket.RemoteEndPoint.ToString() + "異常退出\r\n"); socketList.Remove(pSocket); pSocket.Shutdown(SocketShutdown.Both); pSocket.Close(); return; } } }) { IsBackground = true }.Start(proxSocket); } }); thread.IsBackground = true; thread.Start(socket); } private void btnSend_Click(object sender, EventArgs e) { string str = txtSend.Text; byte[] data = Encoding.Default.GetBytes(str);

    c+上位機與下位機通信代碼示例_上位下位概念_上位詞和下位詞

    foreach (var socket in socketList) { if (socket != null && socket.Connected) { socket.Send(data); } } } }

    上位機實現客戶端功能。具體如下:

    1、字段和屬性

    public readonly IPEndPoint TagetIPEP;
    public bool IsConnected { get; set; } = false;
    private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { /*ReceiveTimeout=1000,SendTimeout=1000*/};
    private Thread recListenThread;
    public string ReceiveStr { get; set; }
    public byte[] ReceiveByte { get; set; }

    是服務器地址和端口。

    是連接的狀態c+上位機與下位機通信代碼示例,這個比較重要,在發送和接收時,都要更加進行,并更新。

    用于和客戶端通訊。

    是監聽客戶端消息的線程。

    和用來存儲客戶端發來的消息。

    2、方法函數連接方法:

    public bool Connect()
        {
          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(() =>
              {
                while (true)
                {
                  try
                  {
                    ReceiveByte = new byte[1024];
                    int realLen = socket.Receive(ReceiveByte);
                    ReceiveStr = Encoding.Default.GetString(ReceiveByte, 0, realLen);
                    ReceiveEvent();
                    if (realLen <= 0)
                    {
                      if (socket != null && socket.Connected)
                      {
                        //服務器退出
                        IsConnected = false;
                        Log.WriteLog("服務器退出!");
                        socket.Shutdown(SocketShutdown.Both);
                        socket.Close();
                        MessageBox.Show("連接斷開!");
                      }
                      return;
                    }
                  }
                  catch (Exception ex)
                  {
                    if (socket != null && socket.Connected)
                    {
                      IsConnected = false;
                      Log.WriteLog("服務器異常退出!", ex);
                      socket.Shutdown(SocketShutdown.Both);
                      socket.Close();
                    }
                    return;
                  }
                }
              })
              { IsBackground = true };
    

    上位詞和下位詞_c+上位機與下位機通信代碼示例_上位下位概念

    recListenThread.Start(); return true; //} } catch (Exception ex) { Log.WriteLog(TagetIPEP.Address + "連接失敗", ex); } return false; }

    連接函數返回值為bool類型,根據返回值判斷連接是否成功連接。這里每次連接都實例化了一個,因為在執行.close()后,重新打開會失敗,而斷線重連會經常用到,沒有找到更好的方法c+上位機與下位機通信代碼示例,干脆重新實例化。連接成功后,開啟監聽服務端消息的線程。這里使用了一個()事件,在接收到消息時會觸發這個事件,刷新UI界面。

    發送方法:

    public bool Send(string msg)
        {
          byte[] sendMsg = Encoding.Default.GetBytes(msg);
          if (sendMsg.Length > 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;

    每次接收消息時觸發,獲取屬性和的值,刷新UI界面。

    完整代碼:

    public class TCPClient
      {
        public TCPClient(/*IPEndPoint localIPEP,*/IPEndPoint targetIPEP)
        {
          //socket.Bind(localIPEP);
          TagetIPEP = targetIPEP;
          
        }
        public readonly IPEndPoint TagetIPEP;
        public bool IsConnected { get; set; } = false;
        private Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { /*ReceiveTimeout=1000,SendTimeout=1000*/};
        public bool Connect()
        {
          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)
            //{
    

    上位下位概念_上位詞和下位詞_c+上位機與下位機通信代碼示例

    socket.Connect(TagetIPEP.Address, TagetIPEP.Port); IsConnected = true; //開啟接收監聽 recListenThread = new Thread(() => { while (true) { try { ReceiveByte = new byte[1024]; int realLen = socket.Receive(ReceiveByte); ReceiveStr = Encoding.Default.GetString(ReceiveByte, 0, realLen); ReceiveEvent(); if (realLen <= 0) { if (socket != null && socket.Connected) { //服務器退出 IsConnected = false; Log.WriteLog("服務器退出!"); socket.Shutdown(SocketShutdown.Both); socket.Close(); MessageBox.Show("連接斷開!"); } return; } } catch (Exception ex) { if (socket != null && socket.Connected) { IsConnected = false; Log.WriteLog("服務器異常退出!", ex); socket.Shutdown(SocketShutdown.Both); socket.Close(); } return; } } }) { IsBackground = true }; recListenThread.Start(); return true; //} } catch (Exception ex) { Log.WriteLog(TagetIPEP.Address + "連接失敗", ex); } return false; } public bool Send(string msg) { byte[] sendMsg = Encoding.Default.GetBytes(msg); if (sendMsg.Length > 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 event Action ReceiveEvent; public string ReceiveStr { get; set; } public byte[] ReceiveByte { get; set; } public void Close() {

    c+上位機與下位機通信代碼示例_上位詞和下位詞_上位下位概念

    if (socket != null && socket.Connected) { IsConnected = false; recListenThread.Abort(); Log.WriteLog("關閉連接!"); socket.Shutdown(SocketShutdown.Both); socket.Close(); } } private Thread recListenThread; }

    前臺調用,聲明Timer定時器,每個一秒觸發一次。觸發事件如下:

    private string flag = "";
        private void QueryTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
          Now = DateTime.Now;
          if (!tcp.Send("MEAS:VOLTage:ALL?\n"))
          {
            queryTimer.Enabled = false;
            StartContent = "開始";
            ConnContent = "連接";
            tcp.IsConnected = false;
            MessageBox.Show("查詢失敗!");
            return;
          }
          flag = "V";
          Thread.Sleep(50);
          if (!tcp.Send("MEAS:CURR:ALL?\n"))
          {
            queryTimer.Enabled = 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(() =>
            {
              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 = 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);
              }
            });
          });
        }

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有