请教关于程序死机的故障

问题描述

privatevoidMeterSetDelayState(string[]sPara){csInterfacecsInter=newcsInterface();intiSum=int.Parse(sPara[4]);string[]strValue=newstring[iSum];for(intTi=1;Ti<=iSum;Ti++){strValue[Ti-1]=csInter.INIReadValue(sPara[2],"P"+Ti.ToString(),"",strFile485);}stringDelayValue="";objectArgSTR;stringDataValue="";DataValue=sPara[2]+"|"+strValue[1]+"|"+DelayValue;ArgSTR=(object)DataValue;////ThreadmyTD=newThread(newParameterizedThreadStart(ThreadSetDelayData));////myTD.Start(ArgSTR);////myTD.IsBackground=true;ThreadSetDelayData(ArgSTR);csInter.INIWriteValue(sPara[2],"OverTag","OK",strFile485);}privatevoidThreadSetDelayData(objectArgSTR){stringMydata=GetIdentityData();while(true){strResult="";for(intTi=1;Ti<=GroupBws;Ti++){intBwhID=ErrBoardNO*GroupBws+Ti;boolbTag=true;if(Bswitch!="A"){if(Bswitch.Substring(BwhID-1,1)=="0"){bTag=false;strResult=strResult+"N";}}if(bTag==true&&bOK[BwhID-1]==false){stringESAMSTR="";boolRtnOK=false;stringPassSTR="";stringDataValue="";stringMeterIDvalue=csInter.INIReadValue("485InitAddress",BwhID.ToString(),"",strFile485);bTag=GetESAMData(BwhID,MeterIDvalue,Mydata,outESAMSTR);if(MeterSendType==1){csInter.WaitTime(0.1);ESAMSTR=DLT645ReadDataResult(BwhID,outRtnOK);}if(RtnOK==true&&ESAMSTR.Length>=2*12){csInter.INIWriteValue("ESAM",BwhID.ToString(),ESAMSTR,strFile485);//SetText("ESAM"+"->"+BwhID.ToString()+"="+ESAMSTR,1,2);RtnOK=DLT6452007SetDelayStateParameter(BwhID,DelayValue,ESAMSTR,outPassSTR);csInter.WaitTime(0.1);if(RtnOK==true&&PassSTR.Length>=20*2){csInter.INIWriteValue("delaypassData",BwhID.ToString(),PassSTR,strFile485);//SetText("delayPassData->"+BwhID.ToString()+"="+PassSTR,1,0);}stringSafeDJ=csInter.INIReadValue("密文等级","dj","98",strFile485);if(PassSTR.Length>0){RtnOK=DLT6452007SetDelayState(BwhID,MeterIDvalue,PassData[BwhID-1].Substring(0,6),SafeDJ,PassSTR,outDataValue);if(MeterSendType==1){csInter.WaitTime(0.1);DataValue=DLT645ReadDataResult(BwhID,outRtnOK);}if(RtnOK==true){strResult=strResult+"S";bOK[BwhID-1]=true;csInter.INIWriteValue(Section,BwhID.ToString(),"1",strFile485);SetText(Section+BwhID.ToString()+"="+RtnOK.ToString(),1,0);}else{strResult=strResult+"F";}}}}elseif(bOK[BwhID-1]==true&&bTag==true){strResult=strResult+"S";}strReadOK=csInter.INIReadValue(Section,"OverTag","",strFileErr);WorkState=csInter.INIReadValue("system","workstate","",strFileErr);if(StopThread==true||WorkState!="1")//{ThreadOK=true;break;//主程序停止工作了,线程也要停止工作,目的防止线程没有停止}Application.DoEvents();}csInter.INIWriteValue(Section,"SetOkTag",strResult,strFile485);boolbAllOK=CheckIsOK(Bswitch,bOK);if(bAllOK==false)iCS=iCS+1;strReadOK=csInter.INIReadValue(Section,"OverTag","",strFileErr);WorkState=csInter.INIReadValue("system","workstate","",strFileErr);if(bAllOK==true||iCS>2||strReadOK.ToUpper()=="OK"||StopThread==true||WorkState!="1")//{ThreadOK=true;break;//主程序停止工作了,线程也要停止工作,目的防止线程没有停止}if(IsDebugTag==2)CheckSoftRunState();Application.DoEvents();}ThreadOK=true;NetStateTR.Enabled=true;}privatevoidThreadWriteLogData(objectArgMsg){lock(LockObject){char[]spitTag={'#'};string[]myPara=ArgMsg.ToString().Split(spitTag);csInterfacecsInter=newcsInterface();stringstrValue="";stringstrMsg=myPara[0];intiTag=int.Parse(myPara[1]);stringIsErrValue=myPara[2];stringstrTime=DateTime.Now.ToString("yyyy-MM-ddHH:mm:ssffff");if(iTag==0){strValue=strValue+"->Tx:";}elseif(iTag==1){strValue=strValue+"->Rx:";}strValue=strValue+strMsg;GiveSetText(strTime+strValue+"rn");csInter.MaxRow=csInter.MaxRow+1;if(csInter.MaxRow>=100){ShowMessage.Clear();csInter.MaxRow=0;}stringwtData=strTime+strValue;objectArgSTR=(object)wtData;//ThreadmyTD=newThread(newParameterizedThreadStart(WriteLogFile));//myTD.Start(ArgSTR);//myTD.IsBackground=true;WriteLogFile(ArgSTR);Application.DoEvents();}//WriteLogFile(strTime+strValue,IsErr);}privatevoidWriteLogFile(objectArgSTR){lock(LockObject){csInterfacecsInter=newcsInterface();//csInter.WaitTime(0.1);stringstrLogFile=Application.StartupPath+"\datalog\";if(Directory.Exists(strLogFile)==false){Directory.CreateDirectory(strLogFile);}strLogFile=strLogFile+"Err"+DateTime.Now.ToString("yyyyMMdd")+".log";csInter.WriteDataLog(strLogFile,ArgSTR.ToString()+"rn");Application.DoEvents();}}

解决方案

解决方案二:
///<summary>///stringSendByteArrToCOM发送命令到串口///boolIsFFCmdtrue是广播命令,false不是广播命令主要用于采用通过误差通道发送的时候使用///outstringoutputString返回数据内容///</summary>///<paramname="SendB"></param>///<paramname="IsFFCmd"></param>///<paramname="outputString"></param>///<returns></returns>privateboolSendByteArrToCOM(byte[]SendB,boolIsFFCmd,outstringoutputString){//try//{lock(LockObject)//加锁防止客户出现抢发命令{RevData=null;boolbTag=InitCOMparameter(strCOM,strBTL,strParity,strBit,strStop);csDLT6452007cs645=newcsDLT6452007();csErrAnd485cs485=newcsErrAnd485();csWirelesscsWL=newcsWireless();if(bTag==true){sptCOM.Write(SendB,0,SendB.Length);}else{outputString="";returnfalse;}bRevOK=false;stringstrData="";DateTimedtStart;DateTimedtEnd;TimeSpantsWait;dtStart=DateTime.Now;while(bRevOK==false){if(IsFFCmd==true)break;//广播命令不需要回答if(ErrBoardWireless==1&&IsErr==0){bRevOK=csWL.CheckRevDataCS(RevData);}elseif(MeterWireless==1&&(IsErr==1||IsErr==2)){bRevOK=csWL.CheckRevDataCS(RevData);}else{if(IsErr==1){bRevOK=cs645.CheckReceivedOK(RevData,0x16,0);}else{bRevOK=cs485.CheckReceivedOK(RevData,cs485.bEndNumber,0);}}dtEnd=DateTime.Now;tsWait=dtEnd.Subtract(dtStart);////SetText(tsWait.TotalSeconds.ToString(),1,0);if(tsWait.TotalSeconds>=1.5&&RevData==null)break;//若500毫秒没收到数据就不需再等待了if(tsWait.TotalSeconds>=1.5&&RevData.Length==0)break;//若500毫秒没收到数据就不需再等待了if(tsWait.TotalSeconds>2)break;//最多等待1.5秒钟//Application.DoEvents();}sptCOM.Close();//SetText("ihaverunhere",1,0);stringstrValue="";boolbTagJG=false;if(IsFFCmd==true)bTagJG=true;if(bRevOK==true){strData=cs485.GetByteArrToString(RevData);SetText(strData,1,IsErr);if(ErrBoardWireless==1&&IsErr==0){strData=csWL.ExplainData(strData);SetText(strData,1,IsErr);}elseif(MeterWireless==1&&(IsErr==1||IsErr==2)){strData=csWL.ExplainData(strData);SetText(strData,1,IsErr);}if(IsErr==1)//645命令直接从过串口发送返回的数据{bTagJG=cs645.ExplainDataFor645(strData,outstrValue);}elseif(IsErr==0)//误差板本身的命令{bTagJG=cs485.ExplainErrBoardData(strData,outstrValue);}elseif(IsErr==2)//通过误差板转发的645命令{bTagJG=cs485.ExplainErrBoardData(strData,outstrData);if(strData.Length>0&&bTagJG==true){bTagJG=cs645.ExplainDataFor645(strData,outstrValue);}else{bTagJG=false;}}}else{strData=cs485.GetByteArrToString(RevData);if(strData.Length>0)SetText(strData,1,IsErr);}outputString=strValue;returnbTagJG;}//}//catch(ExceptionErrMsg)//{//SetText("收到故障信息:"+ErrMsg.ToString(),1,0);//outputString="";//returnfalse;//}}privateboolInitCOMparameter(stringstrCOMName,stringstrBTL,stringstrJY,stringstrBit,stringstrStop){boolbTagOpen=false;//try//{sptCOM.PortName=strCOMName;sptCOM.BaudRate=int.Parse(strBTL);if(strJY.ToUpper()=="E"){sptCOM.Parity=Parity.Even;}elseif(strJY.ToUpper()=="O"){sptCOM.Parity=Parity.Odd;}elseif(strJY.ToUpper()=="N"){sptCOM.Parity=Parity.None;}elseif(strJY.ToUpper()=="S"){sptCOM.Parity=Parity.Space;}elseif(strJY.ToUpper()=="M"){sptCOM.Parity=Parity.Mark;}if(strStop=="0"){sptCOM.StopBits=StopBits.None;}elseif(strStop=="1"){sptCOM.StopBits=StopBits.One;}elseif(strStop=="1.5"){sptCOM.StopBits=StopBits.OnePointFive;}elseif(strStop=="2"){sptCOM.StopBits=StopBits.Two;}sptCOM.DataBits=int.Parse(strBit);if(sptCOM.IsOpen==true)sptCOM.Close();sptCOM.Open();if(sptCOM.IsOpen==true)bTagOpen=true;//}//catch(Exceptionee)//{//sptCOM.Close();//SetText("故障信息:"+ee.Message,1,0);//bTagOpen=false;//}returnbTagOpen;}

解决方案三:
问题现象是:向串口发送数据后,串口无回答数据,程序死机,程序死机又没有让系统死机,该程序占用CPU是0,点击代码任意处设置断点后,VS代码编辑器鼠标后面无响应了,只能关闭程序界面的"X"后,vs代码编辑器又可以响应了,请高手帮我分析是啥原因
解决方案四:
太长,你检查一下是否是死循环
解决方案五:
3楼的,谢谢,没有死循环问题,如果是死循环的话,cpu就是不是0
解决方案六:
看看是否有死锁
解决方案七:
5楼,谢谢,您好!我使用了lock,应该是不会有问题的。问题是发送数据到串口后,串口响应了一会儿后,后面就没响应了,数据也没有回答。
解决方案八:
串口通信没有问题吗?数据是否有发出去或接收数据?

时间: 2024-09-25 20:30:09

请教关于程序死机的故障的相关文章

急啊,BackgroundWorker 控件和切换输入法造成程序死机的问题

问题描述 如题,我在winform程序中使用BackgroundWorker控件来处理界面数据,以防止程序出现未响应的状态,并且根据需求,在程序运行的过程中需要一直使用到BackgroundWorker控件进行后台处理,但是,我在界面上,或者其他的弹出窗体上进行切换输入法时,程序会出现未响应而死掉,这是咋回事呀? 解决方案 解决方案二:遇到过..不过忘记解决方法了和线程有关是不是用到了timer的定时执行之类解决方案三:引用1楼luochanghua的回复: 遇到过..不过忘记解决方法了和线程有

电脑死机预防技巧

电脑的死机现象令所有电脑爱好者都头疼不已,但是死机又是不可避免的,不过您不用担心,因为还有不少有效减少电脑死机的方法,其方法就在我们平时使用电脑的点点滴滴当中.这里为您收集了一些导致电脑死机的故障原因和防治方法,希望对您有所帮助. 1.CPU最好不要超频过高 现在的CPU和显示卡由于采用了新工艺,所以都具有不错的超频性能,追逐高频.超频CPU也成为时下攒机的流行.但是,就在您欣喜于超频为您带来的高速工作时,死机正在悄悄地威胁着您的电脑. 超频极易引起系统的不稳定甚至死机.对于由超频引起的死机现象

WindowsXP,Win 7操作系统常见死机问题的解决方法

大家都知道死机是你在使用计算机过程中最常见的故障之一,而造成死机的原因却扑朔迷离,让人难以捉摸.在以前dos时代,造成死机原因通常是以病毒为主,当然也有其它方面的原因,如应用软件的设置等等,所以解决死机也就有一定的模式,具体就是先杀毒,检查硬盘空间是不是够用,接着检查 autoexec.bat和config.sys文件中是否有错误命令,如果问题还得不到解决,可以检查检查硬件,如此而已.而现在却不同啦,现在是 windows时代了,造成死机的原因却是千变万化,所以处理起来相当的棘手.不管咋样,解决

电脑频繁死机怎么办

电脑频繁死机怎么办 电脑频繁死机怎么办?随机性故障是计算机使用过程中经常遇到的一种常见故障,由于出现死机的故障不确定,所做操作性质不固定,而且死机发生时,显示的现象也不统一,所以故障发生的范围不易确定,给维修工作带来了一定的难度. 根据大量的维修实例分析总结,随机性死机故障产生的原因主要是以下三个方面: 一.环境因素 环境因素对于机器的正常运行有着很大的影响.计算机对环境的要求主要包括:温度.湿度.电网干扰.电磁冲击.外界振动冲击.静电.接地系统.供电系统等方面内容.其中尤以温度.湿度.静电.接

看看电脑为什么会死机

大家都知道死机是你在使用计算机过程中最常见的故障之一,而造成死机的原因却扑朔迷离,让人难以捉摸.在以前dos时代,造成死机原因通常是以病毒为主,当然也有其它方面的原因,如应用软件的设置等等,所以解决死机也就有一定的模式,具体就是先杀毒,检查硬盘空间是不是够用,接着检查 autoexec.bat和config.sys文件中是否有错误命令,如果问题还得不到解决,可以检查检查硬件,如此而已.而现在却不同啦,现在是 windows时代了,造成死机的原因却是千变万化,所以处理起来相当的棘手.不管咋样,解决

插入u盘后电脑就死机怎么办

  经常会遇到的一个问题就是,电脑一插入U盘就死机,这是什么原因呢.后来请教高年级计算系的学长才得已解决,现在把方法分享给大家,希望对大家有所帮助. 会出现这种状况是因为电脑中了ROSE病毒,那要如何解决呢,听我一一道来. 1.Ctrl+Alt+Delete调出任务管理器,在进程页面中结束掉所有名称为Rose.exe的进程(建议在后面的操作中反复此操作,以确保病毒文件不会反复发作). 2.开始--运行中输入"regedit"(XP系统)打开注册表,点"编辑"--&q

电脑死机了怎么办?

  电脑出故障不用总是求别人,学了这些小知识自己也能搞定. 大家都知道死机是你在使用计算机过程中最常见的故障之一,而造成死机的原因却扑朔迷离,让人难以捉摸.在以前dos时代,造成死机原因通常是以病毒为主,当然也有其它方面的原因,如应用软件的设置等等,所以解决死机也就有一定的模式,具体就是先杀毒,检查硬盘空间是不是够用,接着检查autoexec.bat和config.sys文件中是否有错误命令,如果问题还得不到解决,可以检查检查硬件,如此而已.而现在却不同啦,现在是windows时代了,造成死机的

电脑主机经常死机有什么解决方案

  电脑死机,我们总结了以下25种造成电脑死机的故障原因分析,请参照并加以预防,应该对您有帮助: 1.在同一个硬盘上安装太多的操作系统会引起系统死机或速度慢. 2.CPU.显示卡等配件不要超频过高,要注意温度,否则,在启动或运行时会莫名其妙地重启或死机或者慢. 3.在更换电脑配件时,一定要插好,因为配件接触不良会引起系统死机或慢. 4.BIOS设置要恰当,虽然建议将BIOS设置为最优,但所谓最优并不是最好的,有时最优的设置反倒会引起启动或者运行死机或速度慢. 5.最好配备稳压电源,以免电压不稳引

随机性死机故障分析与排除_硬件维护

随机性故障是计算机使用过程中经常遇到的一种常见故障,由于出现死机的故障不确定,所做操作性质不固定,而且死机发生时,显示的现象也不统一,所以故障发生的范围不易确定,给维修工作带来了一定的难度.    根据大量的维修实例分析总结,随机性死机故障产生的原因主要是以下三个方面:    一.环境因素    环境因素对于机器的正常运行有着很大的影响.计算机对环境的要求主要包括:温度.湿度.电网干扰.电磁冲击.外界振动冲击.静电.接地系统.供电系统等方面内容.其中尤以温度.湿度.静电.接地系统.供电系统对机器