private string strTemp = ""; //这是一个用来标识状态的字符 接收数据之后这个就自动更改成为“接收” /// <summary> /// 下发数据 /// </summary> /// <param name="str">需要下发的数据</param> /// <param name="second">系统每隔单位时间去判断的时间间隔</param> /// <param name="time_To_Timeout">每次接收数据设置的超时时间</param> public void SendData(string str, int second, int time_To_Timeout) { strTemp = ""; //接收到的数据 每次发送之前需要手工清零一下 byte[] BytescmdTosend = StringToBytes(str); sp.Write(BytescmdTosend, 0, BytescmdTosend.Length); WaitRec wr = new WaitRec(str, second, time_To_Timeout); ParameterizedThreadStart ParStart = new ParameterizedThreadStart(WaitRec); Thread myThread = new Thread(ParStart); myThread.IsBackground = true; myThread.Start(wr); }
/// <summary> /// 是一个循环,如果没有接受到需要的数据继续等待直到等到超时时间为止 /// </summary> /// <param name="obj"></param> private void WaitRec(object obj) { WaitRec wr = (WaitRec)obj; bool b = false; //这个布尔型的标识主要用来标识是否已经接收到返回值 int Int_SpendAlready = 0; //当前已经消耗的时间 for (int i = 0; i < wr.time_To_Timeout / wr.second; i++) { if (FunctionGetCmdCorrect(strTemp) == true) { b = true; break; } else { //返回的数据strTemp到目前为止还没有符合376.1规则的要求 for (int j = 0; j < wr.second; j++) { Thread.Sleep(1000); Int_SpendAlready++; //这里的意思是在前台的UI上边展示每次的超时时间和已经消耗的时间 //Application.OpenForms["Frm_JZQMYPLGX"].Controls.Find("Lbl_Wait", true)[0].Text = "当前耗时:" + Int_SpendAlready + "秒 " + "\r\n超时时间:" + wr.time_To_Timeout + "秒"; if (FunctionGetCmdCorrect(strTemp) == true) { //自己定义个函数用来判断返回的数据是否符合要求 b = true; break; } else { b = false; continue; } } } } #region 执行完操作之后的程序 if (b == true) { action(strTemp); } else { sp.Close(); TimeOutAction("操作时间" + wr.time_To_Timeout + "秒已到,请检查报文!"); } #endregion }