请教关于程序死机的故障

ucyhboy 2011-12-22 09:31:55

private void MeterSetDelayState(string[] sPara)
{
csInterface csInter = new csInterface();
int iSum = int.Parse(sPara[4]);
string[] strValue = new string[iSum];
for (int Ti = 1; Ti <= iSum; Ti++)
{
strValue[Ti - 1] = csInter.INIReadValue(sPara[2], "P" + Ti.ToString(), "", strFile485);
}
string DelayValue = "";

object ArgSTR;
string DataValue = "";
DataValue = sPara[2] + "|" + strValue[1] + "|" + DelayValue;
ArgSTR = (object)DataValue;
////Thread myTD = new Thread(new ParameterizedThreadStart(ThreadSetDelayData));
////myTD.Start(ArgSTR);
////myTD.IsBackground = true;
ThreadSetDelayData(ArgSTR);

csInter.INIWriteValue(sPara[2], "OverTag", "OK", strFile485);
}
private void ThreadSetDelayData(object ArgSTR)
{
string Mydata=GetIdentityData();
while (true)
{
strResult = "";
for (int Ti = 1; Ti <= GroupBws; Ti++)
{
int BwhID = ErrBoardNO * GroupBws + Ti;
bool bTag = true;
if (Bswitch != "A")
{
if (Bswitch.Substring(BwhID - 1, 1) == "0") { bTag = false; strResult = strResult + "N"; }
}
if (bTag == true && bOK[BwhID - 1] == false)
{
string ESAMSTR = "";
bool RtnOK = false;
string PassSTR = "";
string DataValue = "";
string MeterIDvalue = csInter.INIReadValue("485InitAddress", BwhID.ToString(), "", strFile485);
bTag = GetESAMData(BwhID, MeterIDvalue,Mydata, out ESAMSTR);
if (MeterSendType == 1)
{
csInter.WaitTime(0.1);
ESAMSTR = DLT645ReadDataResult(BwhID, out RtnOK);
}
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, out PassSTR);
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);
}
string SafeDJ = csInter.INIReadValue("密文等级", "dj", "98", strFile485);
if (PassSTR.Length > 0)
{
RtnOK = DLT6452007SetDelayState(BwhID, MeterIDvalue, PassData[BwhID - 1].Substring(0, 6), SafeDJ, PassSTR, out DataValue);
if (MeterSendType == 1)
{
csInter.WaitTime(0.1);
DataValue = DLT645ReadDataResult(BwhID, out RtnOK);
}
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";
}
}
}

}
else if (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);
bool bAllOK = 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 ;

}
private void ThreadWriteLogData(object ArgMsg)
{
lock (LockObject)
{
char[] spitTag = { '#' };
string[] myPara = ArgMsg.ToString().Split(spitTag);
csInterface csInter = new csInterface();
string strValue = "";
string strMsg = myPara[0];
int iTag = int.Parse(myPara[1]);
string IsErrValue = myPara[2];
string strTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff");
if (iTag == 0)
{
strValue = strValue + "->Tx:";
}
else if (iTag == 1)
{
strValue = strValue + "->Rx:";
}
strValue = strValue + strMsg;
GiveSetText(strTime + strValue + "\r\n");

csInter.MaxRow = csInter.MaxRow + 1;
if (csInter.MaxRow >= 100)
{
ShowMessage.Clear();
csInter.MaxRow = 0;
}
string wtData = strTime + strValue;
object ArgSTR = (object)wtData;
//Thread myTD = new Thread(new ParameterizedThreadStart(WriteLogFile));
//myTD.Start(ArgSTR);
//myTD.IsBackground = true;
WriteLogFile(ArgSTR);
Application.DoEvents();
}

//WriteLogFile(strTime + strValue, IsErr);
}
private void WriteLogFile(object ArgSTR)
{
lock (LockObject)
{
csInterface csInter = new csInterface();
//csInter.WaitTime(0.1);
string strLogFile = Application.StartupPath + "\\datalog\\";
if (Directory.Exists(strLogFile) == false)
{
Directory.CreateDirectory(strLogFile);
}
strLogFile = strLogFile + "Err" + DateTime.Now.ToString("yyyyMMdd") + ".log";

csInter.WriteDataLog(strLogFile, ArgSTR.ToString()+"\r\n");
Application.DoEvents();
}

}
...全文
90 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xue_howar 2011-12-23
  • 打赏
  • 举报
回复
串口通信没有问题吗?数据是否有发出去或接收数据?
ucyhboy 2011-12-22
  • 打赏
  • 举报
回复
5楼,谢谢,您好!我使用了lock,应该是不会有问题的。问题是发送数据到串口后,串口响应了一会儿后,后面就没响应了,数据也没有回答。
阿非 2011-12-22
  • 打赏
  • 举报
回复
看看是否有死锁
ucyhboy 2011-12-22
  • 打赏
  • 举报
回复
3楼的,谢谢,没有死循环问题,如果是死循环的话,cpu就是不是0
DENQH 2011-12-22
  • 打赏
  • 举报
回复
太长,你检查一下是否是死循环
ucyhboy 2011-12-22
  • 打赏
  • 举报
回复
问题现象是:向串口发送数据后,串口无回答数据,程序死机,程序死机又没有让系统死机,该程序占用CPU是0,点击代码任意处设置断点后,VS代码编辑器鼠标后面无响应了,只能关闭程序界面的"X"后,vs代码编辑器又可以响应了,请高手帮我分析是啥原因
ucyhboy 2011-12-22
  • 打赏
  • 举报
回复

/// <summary>
/// string SendByteArrToCOM 发送命令到串口
/// bool IsFFCmd true是广播命令,false不是广播命令主要用于采用通过误差通道发送的时候使用
/// out string outputString 返回数据内容
/// </summary>
/// <param name="SendB"></param>
/// <param name="IsFFCmd"></param>
/// <param name="outputString"></param>
/// <returns></returns>
private bool SendByteArrToCOM(byte[] SendB, bool IsFFCmd,out string outputString)
{
//try
//{
lock (LockObject) //加锁防止客户出现抢发命令
{
RevData = null;
bool bTag = InitCOMparameter(strCOM, strBTL, strParity, strBit, strStop);
csDLT6452007 cs645 = new csDLT6452007();
csErrAnd485 cs485 = new csErrAnd485();
csWireless csWL = new csWireless();
if (bTag == true)
{
sptCOM.Write(SendB, 0, SendB.Length);
}
else
{
outputString = "";
return false;
}
bRevOK = false;
string strData = "";
DateTime dtStart;
DateTime dtEnd;
TimeSpan tsWait;
dtStart = DateTime.Now;
while (bRevOK == false)
{
if (IsFFCmd == true) break;//广播命令不需要回答
if (ErrBoardWireless == 1 && IsErr == 0)
{
bRevOK = csWL.CheckRevDataCS(RevData);
}
else if (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("i have run here", 1, 0);
string strValue = "";
bool bTagJG = 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);
}
else if (MeterWireless == 1 && (IsErr == 1 || IsErr == 2))
{
strData = csWL.ExplainData(strData);
SetText(strData, 1, IsErr);
}
if (IsErr == 1)//645命令直接从过串口发送返回的数据
{
bTagJG = cs645.ExplainDataFor645(strData, out strValue);
}
else if (IsErr == 0)//误差板本身的命令
{
bTagJG = cs485.ExplainErrBoardData(strData, out strValue);
}
else if (IsErr == 2)//通过误差板转发的645命令
{
bTagJG = cs485.ExplainErrBoardData(strData, out strData);
if (strData.Length > 0 && bTagJG ==true )
{
bTagJG = cs645.ExplainDataFor645(strData, out strValue);
}
else
{
bTagJG = false;
}
}

}
else
{
strData = cs485.GetByteArrToString(RevData);
if (strData.Length >0) SetText(strData, 1, IsErr);
}
outputString = strValue;
return bTagJG;
}
//}
//catch (Exception ErrMsg)
//{
// SetText("收到故障信息:" + ErrMsg.ToString(), 1, 0);
// outputString = "";
// return false;
//}
}
private bool InitCOMparameter(string strCOMName,string strBTL,string strJY,string strBit,string strStop)
{
bool bTagOpen = false;
//try
//{
sptCOM.PortName = strCOMName;
sptCOM.BaudRate = int.Parse(strBTL);
if (strJY.ToUpper() == "E")
{
sptCOM.Parity = Parity.Even;
}
else if (strJY.ToUpper() == "O")
{
sptCOM.Parity = Parity.Odd;
}
else if (strJY.ToUpper() == "N")
{
sptCOM.Parity = Parity.None;
}
else if (strJY.ToUpper() == "S")
{
sptCOM.Parity = Parity.Space;
}
else if (strJY.ToUpper() == "M")
{
sptCOM.Parity = Parity.Mark;

}

if (strStop == "0")
{
sptCOM.StopBits = StopBits.None;
}
else if (strStop == "1")
{
sptCOM.StopBits = StopBits.One;
}
else if (strStop == "1.5")
{
sptCOM.StopBits = StopBits.OnePointFive;
}
else if (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 (Exception ee)
//{
// sptCOM.Close();
// SetText("故障信息:" + ee.Message, 1, 0);
// bTagOpen = false;
//}
return bTagOpen;
}

110,476

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧