WCF有关问题及串口
WCF问题及串口
我做了一个WCF服务宿主在WPF上。用来监控COM上接的MODEM是否有正常工作(MODEM有3个)。当发现有MODEM工作不正常则发送短信通知管理员后再打电话提醒管理员。问题:
当发送完短信后,管理员也收到了短信。此时WPF窗口及WCF就退出了。在DEBUG下没有扑捉到异常。代码:
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
ExSerialPort sptemp = (ExSerialPort)sender;
ComObject co = new ComObject();
StringBuilder readedmsg = new StringBuilder();
try
{
Thread.Sleep(100);
int rc = 0;
while (rc < 20)
{
if (sptemp.BytesToRead > 0)
{
readbytemsg = sptemp.ReadExisting();
readedmsg.Append(readbytemsg);
if (readbytemsg.IndexOf(">") >= 0)
{
sptemp.IsWaiteSend = true;//等待发送
//rc = 21;
break;
}
}
else
{
rc++;
Thread.Sleep(50);
}
}
}
catch(Exception er)
{
throw new Exception(er.Message);
}
finally
{
sptemp.ReceivedBytesThreshold = 1;
co.CurrentEsp = sptemp;
co.CurrentStr = readedmsg.ToString();
readedmsg = null;
sptemp.ReadOverTime = DateTime.Now;
ThreadPool.UnsafeQueueUserWorkItem(ProcessFromComMsg, co);
ProcessFromComMsg(co);
}
}
private void ProcessFromComMsg(object receivemsg)
{
/* 完成以下内容:
* 1、将串口收到的信息保存到日志文件
* 2、保存新短信到ReceviceSmsContent
*/
try
{
ComObject receiveObject = (ComObject)receivemsg;//这是一个结构类型,有COM对象
// 写日志
FileManager.WriteLogFile(receiveObject.CurrentStr, receiveObject.CurrentEsp.PortName);
//处理常规查询数据
if (!string.IsNullOrEmpty(receiveObject.CurrentStr))
{
//未读短信清单
if (receiveObject.CurrentStr.Contains("+CMGL:"))
{
GetSmsContent(receiveObject.CurrentStr);
}
if (receiveObject.CurrentStr.Contains("ERROR"))
{
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsWaiteSend = false;
receiveObject.CurrentEsp.initErrCount++;
}
if (receiveObject.CurrentStr.Contains("DISCONNECTED") || receiveObject.CurrentStr.Contains("RELEASED"))
{
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsAtd = false;
}
if (receiveObject.CurrentStr.Contains("+CMGS:"))//receiveObject.CurrentStr.Contains("OK") &&
{
receiveObject.CurrentEsp.IsAtd = true;
//receiveObject.CurrentEsp.yesRec = 1;//已读完数据
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsWaiteSend = false;
}
ProcessSendEvent(receiveObject.CurrentEsp);//发送信息
}
else
{
receiveObject.CurrentEsp.initErrCount++;//记得错误次数
}
}
}
catch (Exception er) { throw new Exception(er.Message); }
private void ProcessSendEvent(ExSerialPort esp)//ExSerialPort是自定义的类,继承SerialPort
{
try
{
if (esp.IsWaiteSend)//IsWaiteSend判读是否是接受发送信息状态
{
esp.Write(esp.NowSendSms + CustomEnum.Constant.Ctrl_zStr);
esp.IsWaiteSend = false;
esp.NowSendSms = null;
}
Thread.Sleep(100);
if (esp.IsAtd)
{
esp.Write(CustomEnum.AtOrder.ATD + esp.RecPhone.Trim() + ";" + CustomEnum.Constant.LineBreak);
esp.IsAtd = false;
}
//Thread.Sleep(100);
//if (esp.DelYN)
//{
// esp.Write(CustomEnum.AtOrder.AT_CMGD.CMGD_readed);
// Thread.Sleep(300);
// esp.DelYN = false;
//}
}
catch (Exception er) { throw new Exception(er.Message); }
esp.yesRec = 1;//本次数据是否处理完成,1表示完成
当运行完 esp.yesRec = 1;语句后,wpf和WCF即退出。
------解决思路----------------------
进程异常,先不要写文本。
我做了一个WCF服务宿主在WPF上。用来监控COM上接的MODEM是否有正常工作(MODEM有3个)。当发现有MODEM工作不正常则发送短信通知管理员后再打电话提醒管理员。问题:
当发送完短信后,管理员也收到了短信。此时WPF窗口及WCF就退出了。在DEBUG下没有扑捉到异常。代码:
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
ExSerialPort sptemp = (ExSerialPort)sender;
ComObject co = new ComObject();
StringBuilder readedmsg = new StringBuilder();
try
{
Thread.Sleep(100);
int rc = 0;
while (rc < 20)
{
if (sptemp.BytesToRead > 0)
{
readbytemsg = sptemp.ReadExisting();
readedmsg.Append(readbytemsg);
if (readbytemsg.IndexOf(">") >= 0)
{
sptemp.IsWaiteSend = true;//等待发送
//rc = 21;
break;
}
}
else
{
rc++;
Thread.Sleep(50);
}
}
}
catch(Exception er)
{
throw new Exception(er.Message);
}
finally
{
sptemp.ReceivedBytesThreshold = 1;
co.CurrentEsp = sptemp;
co.CurrentStr = readedmsg.ToString();
readedmsg = null;
sptemp.ReadOverTime = DateTime.Now;
ThreadPool.UnsafeQueueUserWorkItem(ProcessFromComMsg, co);
ProcessFromComMsg(co);
}
}
private void ProcessFromComMsg(object receivemsg)
{
/* 完成以下内容:
* 1、将串口收到的信息保存到日志文件
* 2、保存新短信到ReceviceSmsContent
*/
try
{
ComObject receiveObject = (ComObject)receivemsg;//这是一个结构类型,有COM对象
// 写日志
FileManager.WriteLogFile(receiveObject.CurrentStr, receiveObject.CurrentEsp.PortName);
//处理常规查询数据
if (!string.IsNullOrEmpty(receiveObject.CurrentStr))
{
//未读短信清单
if (receiveObject.CurrentStr.Contains("+CMGL:"))
{
GetSmsContent(receiveObject.CurrentStr);
}
if (receiveObject.CurrentStr.Contains("ERROR"))
{
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsWaiteSend = false;
receiveObject.CurrentEsp.initErrCount++;
}
if (receiveObject.CurrentStr.Contains("DISCONNECTED") || receiveObject.CurrentStr.Contains("RELEASED"))
{
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsAtd = false;
}
if (receiveObject.CurrentStr.Contains("+CMGS:"))//receiveObject.CurrentStr.Contains("OK") &&
{
receiveObject.CurrentEsp.IsAtd = true;
//receiveObject.CurrentEsp.yesRec = 1;//已读完数据
receiveObject.CurrentEsp.NowSendSms = null;
receiveObject.CurrentEsp.IsWaiteSend = false;
}
ProcessSendEvent(receiveObject.CurrentEsp);//发送信息
}
else
{
receiveObject.CurrentEsp.initErrCount++;//记得错误次数
}
}
}
catch (Exception er) { throw new Exception(er.Message); }
private void ProcessSendEvent(ExSerialPort esp)//ExSerialPort是自定义的类,继承SerialPort
{
try
{
if (esp.IsWaiteSend)//IsWaiteSend判读是否是接受发送信息状态
{
esp.Write(esp.NowSendSms + CustomEnum.Constant.Ctrl_zStr);
esp.IsWaiteSend = false;
esp.NowSendSms = null;
}
Thread.Sleep(100);
if (esp.IsAtd)
{
esp.Write(CustomEnum.AtOrder.ATD + esp.RecPhone.Trim() + ";" + CustomEnum.Constant.LineBreak);
esp.IsAtd = false;
}
//Thread.Sleep(100);
//if (esp.DelYN)
//{
// esp.Write(CustomEnum.AtOrder.AT_CMGD.CMGD_readed);
// Thread.Sleep(300);
// esp.DelYN = false;
//}
}
catch (Exception er) { throw new Exception(er.Message); }
esp.yesRec = 1;//本次数据是否处理完成,1表示完成
当运行完 esp.yesRec = 1;语句后,wpf和WCF即退出。
------解决思路----------------------
进程异常,先不要写文本。