C# 网口demo

csharp 复制代码
bool _testStatus = false;
private void btnOpsStart_Click(object sender, EventArgs e)
{
    int delay = Convert.ToInt32(txtdelay.Text.Trim());
    txtView.Clear();
    txtView.AppendText("******************************************开始烤机********************************" + "\r\n");
    Task.Factory.StartNew(() =>
    {
        Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _testStatus = true;
        try
        {
            client.Connect(new IPEndPoint(IPAddress.Parse(txtIp.Text), Convert.ToInt32(txtPort.Text)));
            SetOpsBtnEnable(false);
            while (_testStatus)
            {
                //端口1做主循环,其他三个端口做子循环
                for (int i = 0; i <= 4; i++)
                {
                    for (int j = 0; j <= 4; j++)
                    {
                        for (int k = 0; k <= 4; k++)
                        {
                            for (int l = 0; l <= 4; l++)
                            {
                                if (!_testStatus)
                                {
                                    return;
                                }
                                string send = $"Configure:WorkChannelAll {i} {j} {k} {l}";
                                ShowMsg(send);
                                client.Send(Encoding.ASCII.GetBytes(send + "\n"));
                                Thread.Sleep(delay);
                                string select = $"Configure:WorkChannelAll?";
                                ShowMsg(select);
                                client.Send(Encoding.ASCII.GetBytes(select + "\n"));
                                //Thread.Sleep(20);
                                string result = string.Empty;
                                string errMsg = string.Empty;
                                ReadResult(client, ref result, ref errMsg);
                                ShowMsg(result);
                                result = result.Replace("\n","");
                                string[] resArr = result.Split(' ');
                                if (i!=Convert.ToInt32(resArr[0]))
                                {
                                    _testStatus = false;
                                    ShowMsgBox($"配置{send}和查询{result}不一致!");
                                }
                                if (j != Convert.ToInt32(resArr[1]))
                                {
                                    _testStatus = false;
                                    ShowMsgBox($"配置{send}和查询{result}不一致!");
                                }
                                if (k != Convert.ToInt32(resArr[2]))
                                {
                                    _testStatus = false;
                                    ShowMsgBox($"配置{send}和查询{result}不一致!");
                                }
                                if (l != Convert.ToInt32(resArr[3]))
                                {
                                    _testStatus = false;
                                    ShowMsgBox($"配置{send}和查询{result}不一致!");
                                }
                                //Thread.Sleep(100);
                            }
                        }
                    }
                    
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            _testStatus = false;
        }
        finally
        {
            client.Shutdown(SocketShutdown.Both);
        }
    }).ContinueWith((task) =>
    {
        SetOpsBtnEnable(true);
    });
}
csharp 复制代码
/// <summary>
/// 读取网口结果 结果是按/n或/r结尾的
/// </summary>
/// <param name="result"></param>
/// <param name="errMsg"></param>
/// <returns></returns>
public bool ReadResult(Socket client, ref string result, ref string errMsg)
{
    try
    {
        lock (_lockWr)
        {
            DateTime triggerStart = DateTime.Now;
            bool pass = true;
            List<byte> listbyte = new List<byte>();
            while (pass)
            {
                DateTime triggerEnd = DateTime.Now;
                double collecTime = (triggerEnd - triggerStart).TotalMilliseconds;
                if (collecTime >= 10000)
                {
                    //MessageBox.Show("Read time over-limit");
                    errMsg = "Read time over-limit";
                    return false;
                }
                int relength = client.Available;
                byte[] rebyte = new byte[relength];
                client.Receive(rebyte);
                foreach (byte a in rebyte)
                {
                    listbyte.Add(a);
                }
                if (listbyte.Count != 0)
                {
                    if (listbyte.Last() == 10 || listbyte.Last() == 13)
                    {
                        pass = false;
                    }
                }
                //Thread.Sleep(5);
            }
            byte[] readbyt1 = new byte[listbyte.Count];
            for (int a = 0; a < listbyte.Count; a++)
            {
                readbyt1[a] = listbyte[a];
            }
            result = System.Text.ASCIIEncoding.Default.GetString(readbyt1);
            return true;
        }
    }
    catch (Exception ex)
    {
        errMsg = ex.ToString();
        return false;
    }
}
csharp 复制代码
private void btnOpsStop_Click(object sender, EventArgs e)
 {
     _testStatus = false;
     //SetOpsBtnEnable(true);
 }

 public void ShowMsg(string msg)
 {
     this.Invoke(new Action(() =>
     {
         if (txtView.Lines.Length > 6000)
         {
             txtView.Clear();
         }
         DateTime date = DateTime.Now;
         this.txtView.AppendText($@"{date.ToString("yyyy-MM-dd HH:mm:ss")} {msg} {"\r\n"}");
     }));
 }

 public void SetOpsBtnEnable(bool isEnable)
 {
     this.Invoke(new Action(() =>
     {
         btnOpsStart.Enabled = isEnable;
         btnSameChannelStart.Enabled = isEnable;
         btnOpsStop.Enabled = !isEnable;
     }));
 }

 public void ShowMsgBox(string ErrMsg)
 {
     this.Invoke(new Action(() =>
     {
         MessageBox.Show(ErrMsg);
     }));
 }
相关推荐
Brookty15 分钟前
深入解析Java类加载与实例化流程
java·开发语言·学习
周杰伦fans29 分钟前
c#设计模式—访问者模式
c#·.net
终焉代码39 分钟前
【C++】map与set底层结构——红黑树
开发语言·数据结构·c++
数字化顾问1 小时前
“AMQP协议深度解析:消息队列背后的通信魔法”之核心概念与SpringBoot落地实战
开发语言·后端·ruby
haing20191 小时前
使用matlab进行牛顿迭代求函数极值的方法
开发语言·matlab·牛顿迭代
kernelknight11 小时前
MATLAB For循环详解:从入门到精通的完整指南
开发语言·其他·matlab
Cx330❀2 小时前
《C++ STL:vector类(下)》:攻克 C++ Vector 的迭代器失效陷阱:从源码层面详解原理与解决方案
开发语言·数据结构·c++·经验分享·算法
user_huenquan2 小时前
胡恩全10.3作业
开发语言·c++
少陵野小Tommy2 小时前
C语言计算行列式的值
c语言·开发语言·学习·学习方法
_extraordinary_2 小时前
Java JVM --- JVM内存区域划分,类加载,GC垃圾回收
java·开发语言·jvm