【发布时间】:2012-07-30 11:36:19
【问题描述】:
我开发了一个 C# 应用程序来读取来自 GSM 调制解调器的呼叫。我使用 定时器 定期读取端口并在有来电时通知我。
现在我正在尝试使用另一个计时器,它将写入 AT+CSQ - 要了解端口上的信号质量,然后读取端口的质量值。在这两个计时器中,我都使用正则表达式来匹配和分离我需要的数据。现在的问题是,只有读取信号质量的我的 timer2 才有效,但不能读取来电的计时器。
定时器读取信号强度:
private void tmr_sig_quality_Tick(object sender, EventArgs e)
{
if (port.IsOpen)
{
port.WriteLine("AT+CSQ");
string s= port.ReadExisting();
var match= Regex.Match(s,@"\+CSQ: (\d+),(\d+)");
if (match.Success)
{
progressBar1.Value = int.Parse(match.Groups[1].Value);
}
}
}
计时器读取来电:
private void timer1_Tick(object sender, EventArgs e)
{
s = port.ReadExisting();
var match = Regex.Match(s, "RING[^\\+]*\\+CLIP:\\s*\"(?<phone>[^\"]*)\",(\\d+),\"([^\"]*)\",(\\w*),\"(\\w*)\",(\\w*)");
if (match.Success && s.Contains("RING"))
{
incall_status.Text = "Incoming Call...." + match.Groups["phone"].Value;
incall_status.Visible = true;
}
}
为什么会发生这种情况以及解决方案?
【问题讨论】:
-
你为什么不在一个定时器调用中同时拥有两者?
-
我这里有一个典型的问题。我这样做了,但我的进度条没有显示任何东西。我使用断点来查看我的字符串已读取的内容,令我惊讶的是它读取正确,并且我的进度条显示了状态。但是当我直接运行我的应用程序时,进度条不显示任何内容。
-
你会发现你无法通过线程来改变UI。如果我没记错的话,计时器使用线程,所以你需要使用 Invoke,即stackoverflow.com/questions/661561/…
-
正确,常规 System.Timer 无法更新 UI DispachedTimer(如果使用 WPF)(msdn.microsoft.com/en-us/library/…)可以更新 UI,但如果运行时间长也会导致 UI 变得迟钝任务,例如轮询串行端口。
标签: c# regex timer progress-bar modem