首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于SerialPort 的 ReadTimeout WriteTimeout解决思路

2013-08-01 
关于SerialPort的ReadTimeoutWriteTimeout我写了一个短信猫发送程序,下边是主要的发送模块。 用的是西门子T

关于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中完成了全部的释放。

热点排行