【发布时间】:2012-08-31 01:58:45
【问题描述】:
在通过串行端口接收数据的处理程序中,当接收到数据时,我将其存储到字符串中并执行 .contains 搜索以确定是否需要对数据进行处理。当应用程序处于空闲状态并且(让我们称之为调制解调器)发送类似“已连接”的内容时,它可以正常工作。
问题是当我轮询机器时。当我启动一个期望返回结果的命令时它不起作用,我不知道为什么。现在,如果我使用消息框启动该功能,它将起作用。我宁愿没有不必要的消息框。
这是我的代码示例。
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired)
{
RefreshTextBox d = new RefreshTextBox(RefreshTextBoxResults);
Invoke(d);
}
else
{
RefreshTextBoxResults();
}
}
private void RefreshTextBoxResults()
{
//MessageBox.Show("refresh text is occurring");
indata1 = serialPort1.ReadExisting();
rx.AppendText(indata1);
string dataCheck = indata1.ToUpper();
//MessageBox.Show(dataCheck);
if (indata1.ToUpper().Contains("CONNECT"))//dataCheck.Contains("CONNECT"))
{
// MessageBox.Show("connect");
cState.Text = "Connected";
if(connected==false)
connectLink();
}
if (dataCheck.Contains("CONNECTED"))
{
// MessageBox.Show("Active Call in Session");
cState.Text = "Connected";
if (connected==false)
connectLink();
}
if (dataCheck.Contains("NO"))
{
cState.Text = "Disconnected";
disconnect();
}
if (dataCheck.Contains("CAMPOS"))
{
campos = indata1;
camDat = true;
}
}
private void cState_Click(object sender, EventArgs e)
{
writeDevice("callstatus");
}
public void writeDevice(string cmd)
{
try
{
{
serialPort1.Write(cmd + "\r\n");
}
}
catch
{ noconnect(); }
}
当我执行 cstate() 时,它应该返回调用状态和类型(如果有)。正如我在提示框中看到的那样,调制解调器确实会响应。如果单词 connected 在那里的任何地方它应该将标签的文本更改为“Connected”。随着代码的放置,该标签没有任何反应。但是,如果我删除 RefreshTextBoxResults() 中第一行的注释,使 MessageBox 处于活动状态,它会检测调制解调器的状态。
我只是不明白发生了什么。有人可以向我解释为什么会这样吗?
【问题讨论】:
-
您是否尝试将 indata1 放入消息框并查看它显示的内容?
-
只是一个观察,前两个 if 语句: if (indata1.ToUpper().Contains("CONNECT")) 和 if (dataCheck.Contains("CONNECTED")) 做同样的事情.
-
你为什么要使用很多如果你应该使用 if else 和 else ......
-
MessageBox 被阻塞,它在等待你点击“OK”时停止执行。如果你改为使用 Debug.WriteLine 会发生什么?
-
绝对不要在
DataReceived事件处理程序中显示消息框或其他资源密集型任务。你只是自找麻烦。如果您只是进行故障排除或开发,最好记录信息或使用调试、跟踪或控制台。
标签: c# visual-studio-2010 serial-port