读书人

关于SerialPort 的 ReadTimeout

发布时间: 2013-08-01 15:23:18 作者: rapoo

关于SerialPort 的 ReadTimeout WriteTimeout

我写了一个短信猫发送程序,下边是主要的发送模块。 用的是西门子TC35。


我想问一下:
1. 程序关闭的时候,串口资源怎么释放,我现在只是调用 SerialPort.close(),是否要调用 Dispose()

2. ReadTimeout WriteTimeout 是否需要设置? 在程序运行中有什么用?





private bool SmsToModem(string userMsg, string phoneNumber)
{
bool isSuccess = false;
try
{

System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();

while (!InitModem())
{
Thread.Sleep(1000);
}

string msgCoded = SmsSerial.GetSendMsg(null, phoneNumber, userMsg); //pdu码
string back_AtCmgs = string.Empty;
string back_Pdu = string.Empty;
string back_Final = string.Empty;//写1a后的反馈
string test = string.Empty;
Byte[] bytesAtBreak;

//写AT命令-长度
sp.DiscardInBuffer();
sw.Restart();
sp.WriteLine("AT+CMGS=" + (msgCoded.Length / 2 - 1).ToString() + "\r\n");


while ( !(back_AtCmgs.Contains(">") || back_AtCmgs.Contains(Constants.Sms_BackERROR)) )
{
Thread.Sleep(30);
back_AtCmgs = back_AtCmgs + sp.ReadExisting();

//超时处理
if (sw.ElapsedMilliseconds/1000 > Constants.Sms_TimeOutSendAT)
{
bytesAtBreak = new Byte[1];
bytesAtBreak[0] = 0X1b;
sp.Write(bytesAtBreak, 0, 1);
Thread.Sleep(300);

isSuccess = false;
return isSuccess;
}
}
sw.Stop();
if (back_AtCmgs.Contains(Constants.Sms_BackERROR))
{
isSuccess = false;
return isSuccess;


}


//写AT命令-pdu
sp.DiscardInBuffer();
sw.Restart();
sp.Write(msgCoded);
while (!back_Pdu.Contains(msgCoded))
{
Thread.Sleep(30);
back_Pdu = back_Pdu + sp.ReadExisting();

//超时处理
if (sw.ElapsedMilliseconds / 1000 > Constants.Sms_TimeOutSendAT)
{
bytesAtBreak = new Byte[1];
bytesAtBreak[0] = 0X1b;
sp.Write(bytesAtBreak, 0, 1);
Thread.Sleep(300);

isSuccess = false;
return isSuccess;
}
}
sw.Stop();





//写AT命令-1a
sp.DiscardInBuffer();
sw.Restart();
Byte[] bytes = new Byte[1];
bytes[0] = 0X1a;
sp.Write(bytes, 0, 1);
while (!(back_Final.Contains("OK") || back_Final.Contains(Constants.Sms_BackERROR)))
{
Thread.Sleep(200);
back_Final = back_Final + sp.ReadExisting();
//超时处理
if (sw.ElapsedMilliseconds / 1000 > Constants.Sms_TimeOutSendAT)
{
bytesAtBreak = new Byte[1];
bytesAtBreak[0] = 0X1b;
sp.Write(bytesAtBreak, 0, 1);
Thread.Sleep(300);

isSuccess = false;
return isSuccess;
}


}
sw.Stop();


if (back_Final.Contains("+CMGS")) //如果没有+CMGS,都没有发送成功. 包括只包含 "OK" "ERROR"
{
isSuccess = true;
}

}
catch
{
}

return isSuccess;

}




[解决办法]
一般close即可,超时是否设置,取决于你,一分钟,2分钟,随你
[解决办法]
引用:
Quote: 引用:

一般close即可,超时是否设置,取决于你,一分钟,2分钟,随你


ReadTimeout 是指sp.ReadExisting()没有响应,程序被阻塞的时间吗?

没错。就是读、写超时的时间。设置大了,性能比较差,设置小了,出错概率增大。

SerialPort是系统的组件么?一般来说,系统组件不需要显式调用Dispose一般也没事。但是如果是第三方程序,就不好说了,最好看下源代码确定,它是否在析构函数调用Dispose,或者在Close中完成了全部的释放。

读书人网 >C#

热点推荐