private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
        {
            try
            {
                do
                {
                    idinfo = CardCpu.readIdCard();

                    Thread.Sleep(1000);
                } while (idinfo == null);

                e.Result = idinfo;
            }
            catch { }
        }
        /// <summary>
        /// 检查是否有卡,如果是有卡则进行读卡信息
        /// </summary>
        /// <returns>如果无卡返回0,有卡并且卡信息正常返回1,有卡时如果验证失败返回错误信息</returns>
        public string CheckCard()
        {
            Thread.Sleep(200);
            StringBuilder sbinput =
                new StringBuilder("<invoke name=\"READCARDTESTINSERTCARD\"><arguments></arguments></invoke>");
            string strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);

            LogService.GlobalInfoMessage("调用检测有卡方法输出返回:" + strResult + ",输出参数:" + sbinput.ToString());
            if (string.IsNullOrEmpty(sbinput.ToString()))
            {
                return("0");
            }

            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(sbinput.ToString());
            System.Xml.XmlNode xnd = doc.SelectSingleNode("/return/arguments/string[@id='CARDSTACKSTATE']");
            if (xnd != null)
            {
                string CardStackState = xnd.InnerText;
                LogService.GlobalInfoMessage("读卡的类型:" + CardType + "****************" + CardStackState);

                if (CardStackState == "1")
                {
                    //如果有卡则读取磁条卡号
                    Thread.Sleep(200);

                    if (CardType == "1")
                    {
                        sbinput =
                            new StringBuilder("<invoke name=\"READCARDREADMAGCARDNO\"><arguments></arguments></invoke>");
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用读取磁条卡号卡方法返回:" + strResult + ",输出参数:" + sbinput.ToString());
                        doc.LoadXml(sbinput.ToString());
                        xnd = doc.SelectSingleNode("/return/arguments/string[@id='CARDNO']");
                        if (xnd != null)
                        {
                            string strCardNO = xnd.InnerText;
                            SkyComm.cardInfoStruct.CardNo = strCardNO;
                            CardRead cardUtility = new CardRead(this);
                            string   strMsg      = cardUtility.GetPatiantInfo();
                            if (!string.IsNullOrEmpty(strMsg))
                            {
                                return(strMsg);
                            }
                            else
                            {
                                return("1");
                            }
                        }
                        else
                        {
                            return("0");
                        }
                    }
                    else if (CardType == "2")
                    {
                        #region 读M1卡方法

                        //卡片移到射频位
                        sbinput =
                            new StringBuilder("<invoke name=\"READCARDMOVECARDTORF\"><arguments></arguments></invoke>");
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用卡片移到射频位方法返回:" + strResult + ",输出参数:" + sbinput.ToString());

                        //读第8块的数据
                        string strInput = "<invoke name=\"READCARDREADRFCARD\"><arguments>" +
                                          "<string id=\"SECTORNO\">8</string>" +
                                          "<string id=\"BLOCKNO\">2</string>" +
                                          "<string id=\"PASSWORD\">FFFFFFFFFFFF</string>" +
                                          "</arguments></invoke>";
                        LogService.GlobalInfoMessage("调用读射频卡数据方法输入参数1:" + strInput);
                        sbinput   = new StringBuilder(strInput);
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用读射频卡数据方法返回:" + strResult + ",输出参数:" + sbinput.ToString());

                        doc.LoadXml(sbinput.ToString());
                        xnd = doc.SelectSingleNode("/return/arguments/string[@id='ERROR']");
                        string strCardNO = string.Empty;
                        if (xnd != null && xnd.InnerText == "SUCCESS")
                        {
                            strCardNO =
                                SkyComm.HexStringToString(
                                    doc.SelectSingleNode("/return/arguments/string[@id='CARDNO']").InnerText,
                                    ASCIIEncoding.ASCII);


                            LogService.GlobalInfoMessage("=============读8扇区的内容===========================" + strCardNO +
                                                         "======================================");

                            if (strCardNO.Length >= 16)
                            {
                                strCardNO = strCardNO.Substring(0, 16);
                            }
                        }

                        if (strCardNO.Length >= 16) //第八块内容小于16
                        {
                        }

                        LogService.GlobalInfoMessage("读取到的卡号信息:" + strCardNO + "===============================");

                        if (!string.IsNullOrEmpty(strCardNO) && strCardNO.Length >= 15)
                        {
                            SkyComm.cardInfoStruct.CardNo = strCardNO.Replace(" ", "").Replace("\0", "").Trim();
                            CardRead cardUtility = new CardRead(this);
                            string   strMsg      = cardUtility.GetPatiantInfo();
                            if (!string.IsNullOrEmpty(strMsg))
                            {
                                return(strMsg);
                            }
                            else
                            {
                                return("1");
                            }
                        }
                        else
                        {
                            return("0");
                        }

                        #endregion
                    }
                    else if (CardType == "3")
                    {
                        #region 读芯片卡方法,暂时屏蔽

                        string mCardNO = CardCpu.getCardNo();

                        SkyComm.cardInfoStruct.CardNo = mCardNO;
                        CardRead cardUtility = new CardRead(this);
                        string   strMsg      = cardUtility.GetPatiantInfo();
                        if (!string.IsNullOrEmpty(strMsg))
                        {
                            return(strMsg);
                        }
                        else
                        {
                            return("1");
                        }

                        #endregion
                    }
                }
                else
                {
                    return("0");
                }
            }
            else
            {
                return("0");
            }
            return("0");
        }
        private void timer1_Tick(object sender, EventArgs e)
        {
            Log.Info(GetType().ToString(), "执行time1", "开始执行timer1_Tick");

            //检测是否有卡
            Thread.Sleep(200);
            StringBuilder sbinput   = new StringBuilder("<invoke name=\"READCARDTESTINSERTCARD\"><arguments></arguments></invoke>");
            string        strResult = "";

            try
            {
                strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
            }
            catch (Exception exception)
            {
                Log.Info(GetType().ToString(), "检测有卡XuHuiInterface_DLL.XmlTcp", exception.Message);
            }
            LogService.GlobalInfoMessage("调用检测有卡方法输出返回:" + strResult + ",输出参数:" + sbinput.ToString());
            if (string.IsNullOrEmpty(sbinput.ToString()))
            {
                return;
            }

            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
            doc.LoadXml(sbinput.ToString());
            System.Xml.XmlNode xnd = doc.SelectSingleNode("/return/arguments/string[@id='CARDSTACKSTATE']");
            if (xnd != null)
            {
                string CardStackState = xnd.InnerText;
                if (CardStackState == "1")
                {
                    timer1.Stop();
                    timer2.Stop();

                    //如果有卡则读取磁条卡号
                    Thread.Sleep(200);
                    if (CardType == "1")
                    {
                        sbinput   = new StringBuilder("<invoke name=\"READCARDREADMAGCARDNO\"><arguments></arguments></invoke>");
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用读取磁条卡号卡方法返回:" + strResult + ",输出参数:" + sbinput.ToString());
                        doc.LoadXml(sbinput.ToString());
                        xnd = doc.SelectSingleNode("/return/arguments/string[@id='CARDNO']");
                        if (xnd != null)
                        {
                            string strCardNO = xnd.InnerText;
                            //如果读取到的磁条卡号长度不对,则读取居民健康卡
                            if (strCardNO.Length != 15)
                            {
                                try
                                {
                                    //LogService.GlobalInfoMessage("2");
                                    //移动到IC位读居民健康卡
                                    sbinput = new StringBuilder("<invoke name=\"READCARDMOVECARDTOREAR\"><arguments></arguments></invoke>");
                                    Thread.Sleep(200);
                                    LogService.GlobalInfoMessage("调用移动卡到卡后端方法输入参数:" + sbinput.ToString());
                                    strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                                    LogService.GlobalInfoMessage("调用移动卡到卡后端方法返回:" + strResult + ",输出参数:" + sbinput.ToString());
                                    if (sbinput.ToString().IndexOf("SUCCESS") > 0)
                                    {
                                        //读居民健康卡
                                        //居民健康卡
                                        HealthCardBase       _cardBase = HealthCardBase.CreateInstance(this);
                                        HealthCardInfoStruct Entity    = _cardBase.HisRead();
                                        SkyComm.cardInfoStruct.CardNo = Entity.HealthCardNo;
                                        if (!backgroundWorker1.IsBusy)
                                        {
                                            backgroundWorker1.RunWorkerAsync();
                                        }
                                        if (string.IsNullOrEmpty(SkyComm.cardInfoStruct.CardNo))
                                        {
                                            SkyComm.ShowMessageInfo("读卡失败,请重新检查卡位方向!");
                                            closePort();
                                            this.DialogResult = DialogResult.Cancel;
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    LogService.GlobalInfoMessage("移动卡到卡后端,读居民健康卡失败:" + ex.Message);

                                    Thread.Sleep(200);
                                    sbinput   = new StringBuilder("<invoke name=\"READCARDOUTCARD\"><arguments></arguments></invoke>");
                                    strResult = AutoServiceSDK.SDK.XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                                    LogService.GlobalInfoMessage("调用退卡卡方法返回:" + strResult + ",输出参数:" + sbinput.ToString());;
                                    SkyComm.ShowMessageInfo("读卡失败,请重新检查卡位方向!");
                                    closePort();
                                    this.DialogResult = DialogResult.Cancel;
                                }
                            }
                            else
                            {
                                //读取就诊卡
                                SkyComm.cardInfoStruct.CardNo = strCardNO;
                                if (!backgroundWorker1.IsBusy)
                                {
                                    backgroundWorker1.RunWorkerAsync();
                                }
                            }
                        }
                        else
                        {
                            //移动到IC位读居民健康卡
                            sbinput = new StringBuilder("<invoke name=\"ReadCardMoveCardToIC\"><arguments></arguments></invoke>");
                            Thread.Sleep(200);
                            strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                            if (strResult.IndexOf("SUCCESS") > 0)
                            {
                                //读居民健康卡
                                //居民健康卡
                                HealthCardBase       _cardBase = HealthCardBase.CreateInstance(this);
                                HealthCardInfoStruct Entity    = _cardBase.HisRead();
                                SkyComm.cardInfoStruct.CardNo = Entity.HealthCardNo;
                                if (!backgroundWorker1.IsBusy)
                                {
                                    backgroundWorker1.RunWorkerAsync();
                                }
                            }
                        }
                    }
                    else if (CardType == "2")
                    {
                        #region 读取M1卡方法
                        //卡片移到射频位
                        sbinput   = new StringBuilder("<invoke name=\"READCARDMOVECARDTORF\"><arguments></arguments></invoke>");
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用卡片移到射频位方法返回:" + strResult + ",输出参数:" + sbinput.ToString());

                        //读第8块的数据
                        string strInput = "<invoke name=\"READCARDREADRFCARD\"><arguments>" +
                                          "<string id=\"SECTORNO\">8</string>" +
                                          "<string id=\"BLOCKNO\">2</string>" +
                                          "<string id=\"PASSWORD\">FFFFFFFFFFFF</string>" +
                                          "</arguments></invoke>";
                        LogService.GlobalInfoMessage("调用读射频卡数据方法输入参数1:" + strInput);
                        sbinput   = new StringBuilder(strInput);
                        strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                        LogService.GlobalInfoMessage("调用读射频卡数据方法返回:" + strResult + ",输出参数:" + sbinput.ToString());

                        doc.LoadXml(sbinput.ToString());
                        xnd = doc.SelectSingleNode("/return/arguments/string[@id='ERROR']");
                        string strCardNO = string.Empty;
                        if (xnd != null && xnd.InnerText == "SUCCESS")
                        {
                            strCardNO = SkyComm.HexStringToString(doc.SelectSingleNode("/return/arguments/string[@id='CARDNO']").InnerText, ASCIIEncoding.ASCII);
                            LogService.GlobalInfoMessage("=============读8扇区的内容===========================" + strCardNO + "======================================");

                            if (strCardNO.Length >= 16)
                            {
                                strCardNO = strCardNO.Substring(0, 16);
                            }
                        }

                        if (strCardNO.Length >= 16)
                        {
                        }


                        LogService.GlobalInfoMessage("读取到的卡号信息:" + strCardNO + "===========================");

                        if (!string.IsNullOrEmpty(strCardNO) && strCardNO.Length >= 15)
                        {
                            //读取就诊卡
                            SkyComm.cardInfoStruct.CardNo = strCardNO.Replace(" ", "").Replace("\0", "").Trim();
                            if (!backgroundWorker1.IsBusy)
                            {
                                backgroundWorker1.RunWorkerAsync();
                            }
                        }
                        else
                        {
                            SkyComm.ShowMessageInfo("读卡失败,请重新检查卡位方向!");
                            closePort();
                            this.DialogResult = DialogResult.Cancel;
                        }
                        #endregion
                    }
                    else if (CardType == "3")
                    {
                        #region 读取芯片卡方法,暂时屏蔽
                        SkyComm.cardInfoStruct.CardNo = CardCpu.getCardNo();


                        if (string.IsNullOrEmpty(SkyComm.cardInfoStruct.CardNo))
                        {
                            try
                            {
                                //LogService.GlobalInfoMessage("2");
                                //移动到IC位读居民健康卡
                                sbinput = new StringBuilder("<invoke name=\"READCARDMOVECARDTOREAR\"><arguments></arguments></invoke>");
                                Thread.Sleep(200);
                                LogService.GlobalInfoMessage("调用移动卡到卡后端方法输入参数:" + sbinput.ToString());
                                strResult = XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                                LogService.GlobalInfoMessage("调用移动卡到卡后端方法返回:" + strResult + ",输出参数:" + sbinput.ToString());
                                if (sbinput.ToString().IndexOf("SUCCESS") > 0)
                                {
                                    //读居民健康卡
                                    //居民健康卡
                                    HealthCardBase       _cardBase = HealthCardBase.CreateInstance(this);
                                    HealthCardInfoStruct Entity    = _cardBase.HisRead();
                                    SkyComm.cardInfoStruct.CardNo = Entity.HealthCardNo;
                                    if (!backgroundWorker1.IsBusy)
                                    {
                                        backgroundWorker1.RunWorkerAsync();
                                    }
                                    if (string.IsNullOrEmpty(SkyComm.cardInfoStruct.CardNo))
                                    {
                                        SkyComm.ShowMessageInfo("读卡失败,请重新检查卡位方向!");
                                        closePort();
                                        this.DialogResult = DialogResult.Cancel;
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                LogService.GlobalInfoMessage("移动卡到卡后端,读居民健康卡失败:" + ex.Message);

                                Thread.Sleep(200);
                                sbinput   = new StringBuilder("<invoke name=\"READCARDOUTCARD\"><arguments></arguments></invoke>");
                                strResult = AutoServiceSDK.SDK.XuHuiInterface_DLL.XmlTcp(sbinput, 0);
                                LogService.GlobalInfoMessage("调用退卡卡方法返回:" + strResult + ",输出参数:" + sbinput.ToString());;
                                SkyComm.ShowMessageInfo("读卡失败,请重新检查卡位方向!");
                                closePort();
                                this.DialogResult = DialogResult.Cancel;
                            }
                        }
                        else
                        {
                            CardRead cardUtility = new CardRead(this);

                            string strMsg = cardUtility.GetPatiantInfo();

                            if (!string.IsNullOrEmpty(strMsg))
                            {
                                SkyComm.ShowMessageInfo(strMsg);
                            }

                            if (!backgroundWorker1.IsBusy)
                            {
                                backgroundWorker1.RunWorkerAsync();
                            }
                        }



                        #endregion
                    }
                }
            }
        }