示例#1
0
        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);
        }
示例#2
0
        /// <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
        }