gpt4 book ai didi

c# - 难道两个timer_tick事件不能并行读取相同的数据执行不同的任务吗?

转载 作者:行者123 更新时间:2023-11-30 22:26:32 25 4
gpt4 key购买 nike

我开发了一个 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;
}
}

为什么会这样,请问解决方法?

最佳答案

两个主要问题。首先是 ReadExisting(),它将始终返回一个空字符串。除非您逐行调试和单步执行代码。这使调制解调器有足够的时间发送响应。但是当你全速运行时这将不起作用,你需要进行阻塞调用以确保你的程序等待足够长的时间以获取所有返回的字符。请改用 ReadLine()。

第二个 killer 问题是你在混合命令。您的 tmr_sig_quality_Tick() 方法可能会读取 timer1_Tick() 应该读取的内容。您需要重新考虑这种方法。类似于命令队列,在收到对命令的响应之前不会前进。

关于c# - 难道两个timer_tick事件不能并行读取相同的数据执行不同的任务吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com