呵呵.给我也来一份 谢谢
[email protected]
 UP 接分.

解决方案 »

  1.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO.Ports;
    using System.Threading;namespace Rs232
    {
        public class Modem
        {
            public struct AttachedModem
            {
                public string Port;
                public string ModemModel;
            }        private SerialPort _port;
            private string _pname = "";
            private int _boudrate = 0;
            private string _answer;
            private SetCallback _call = null;        public delegate void SetCallback(Modem modcall);        // COM端口
            public string PortNumber
            {
                get {return _pname ;}
                set {_pname=value ;}
            }        //端口波特率
            public string PortBoudrate
            {
                get {return _boudrate.ToString() ;}
                set {_boudrate=int.Parse(value) ;}
            }        // 默认波特率(只读)
            public virtual int DefaultBoudrate
            {
                get {return 9600;}
            }        //Modem应答命令(只读)
            public string ModemAnswer
            {
                get {return _answer ;}
            }        // First constructor
            public Modem(SerialPort prt, SetCallback c)
            {
                _call = c;
                _port = prt;
                _port.DataReceived+=new SerialDataReceivedEventHandler(this.DataReceived);
                if (_pname == "") _pname = Modem.FirstAttachedModem().Port ;
                if (_boudrate == 0) _boudrate = this.DefaultBoudrate ;
                OpenModem();
            }
            // Second constructor
            public Modem(SerialPort prt, string prtnum, SetCallback c)
            {
                _call = c;
                _port = prt;
                _port.DataReceived += new SerialDataReceivedEventHandler(this.DataReceived);
                this.PortNumber = prtnum;
                this.PortBoudrate = this.DefaultBoudrate.ToString();
                OpenModem();
            }        public Modem():this(new SerialPort(), null) { }        private void AnalyzeAnswer()
            {
                if (_answer.Length > 0 && _call!=null)
                {
                    _call(this);
                }
            }        //打开
            private void OpenModem()
            {
                this.CloseModem();
                _port.PortName = _pname;
                _port.BaudRate = _boudrate;
                _port.Open();
                this.InitializeModem();
            }
            
            //关闭
            public void CloseModem() 
            {
               if (_port.IsOpen) _port.Close();
            }        //发送命令
            protected void SendCommandToModem(string command)
            {
                _answer = "";
                if (!_port.IsOpen) this.OpenModem();
                _port.Write(command);
            }        // Modem初始化,AT命令。 E0意思是不回显。
            protected virtual void InitializeModem()
            {
                this.SendCommandToModem("ATE0\r");
            }        // 查找制造商,AT命令I4
            public virtual void GetManufacturer()
            {
                this.SendCommandToModem("ATI4\r");
            }        // 查找产品编号,AT命令I0
            public virtual void GetProductId()
            {
                this.SendCommandToModem("ATI0\r");
            }        // 查找COM端口
            // 返回制造商信息,芯片版本号
            public static AttachedModem FirstAttachedModem()
            {
                AttachedModem am = new AttachedModem();
                SerialPort sp = new SerialPort();
                string port, answer;            for (int i = 1; i <= 8; i++)
                {
                    port = "COM" + i.ToString();
                    sp.PortName = port;
                    sp.BaudRate = 9600;                try
                    {
                        sp.Open();
                        if (sp.IsOpen)
                        {
                            sp.Write("ATE0\r");
                            Thread.Sleep(200);
                            answer = sp.ReadExisting().Replace("ATE0","").Trim().ToUpper();
                            if (answer == "OK")
                            {
                                sp.Write("ATI4I3\r");
                                Thread.Sleep(200);
                                answer = sp.ReadExisting().Trim().ToUpper().Replace("\r\nOK","").Trim().Replace("\r\n","");
                                am.Port = port;
                                am.ModemModel = answer;
                                sp.Close();
                                break;
                            }
                        }
                        if (sp.IsOpen) sp.Close();
                    }
                    catch (Exception) {}
                }
                return am;
            }        private void DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                _answer = _port.ReadExisting().Trim().Replace("\r\n\r\n","\r\n");
                this.AnalyzeAnswer();
            }
        }
    }