-
سلام
میبخشید، عضرخواهی میکنم ...
این روزها شدیداً گرفتار هستم و برای یکسری کار اداری، تهران گردی میکنم :n02:
خلاصه عرض کنم، کد شما صحیح نیست ...
مودم خودم این قابلیت را پشتیبانی نمیکند و امکان آزمایش ندارم
ولی کد زیر اصول سرراست و صحیحی دارد و به گمانم جواب دهد، آزمایش بفرمائید...
- یک پروژه WinForm را آغاز کرده
- یک TextBox روی آن قرار دهید
- خط تعریف دلگیت Action در فریم ورک 3.5 به بالا نیازی نیست
- شما باید خصیصه های m_SerialPort را به تنظیمات لازم رایانه خودتان ست کنید، از جمله پورت COM مودم ...
کد:
private delegate void Action(); //you must delete this line in .NetFramework 3.5, 4.0, 4.5 ...
private System.IO.Ports.SerialPort m_SerialPort;
private System.Text.RegularExpressions.Regex m_RegexFinder;
public Form1()
{
this.InitializeComponent();
this.m_RegexFinder = new System.Text.RegularExpressions.Regex(@"NMBR\s*=\s*(\d+)");
this.m_SerialPort = new System.IO.Ports.SerialPort();
this.m_SerialPort.PortName = "COM1";
this.m_SerialPort.BaudRate = 9600;
this.m_SerialPort.DataBits = 8;
this.m_SerialPort.StopBits = System.IO.Ports.StopBits.One;
this.m_SerialPort.Encoding = System.Text.Encoding.ASCII;
this.m_SerialPort.Open();
this.m_SerialPort.DataReceived += this.OnDataReceived;
this.m_SerialPort.WriteLine("AT+VCID=1");
}
protected override void OnFormClosed(System.Windows.Forms.FormClosedEventArgs e)
{
base.OnFormClosed(e);
if (this.m_SerialPort == null) return;
if (!this.m_SerialPort.IsOpen) return;
this.m_SerialPort.Close();
}
private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (e.EventType != System.IO.Ports.SerialData.Chars) return;
this.BeginInvoke(new Action(this.OnRead));
}
private void OnRead()
{
System.Threading.Thread.Sleep(500);
string data = this.m_SerialPort.ReadExisting();
if (string.IsNullOrEmpty(data)) return;
var match = this.m_RegexFinder.Match(data);
if (match == null) return;
if (match.Groups.Count < 2) return;
string number = match.Groups[1].Value;
if (string.IsNullOrEmpty(number)) return;
this.textBox1.Text = number;
}
موفق باشید.