在我通过串行端口接收数据的处理程序中,当接收到数据时,我将其存储到一个字符串中并进行 .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 这个词在那里的任何地方,它应该将标签的文本更改为“已连接”。在代码放置时,该标签没有任何变化。但是,如果我删除 RefreshTextBoxResults() 中第一行的注释使 MessageBox 处于事件状态,它会检测调制解调器的状态。
我只是不明白发生了什么。有人可以向我解释为什么会这样吗?
最佳答案
But, if I remove the comment on the first line in RefreshTextBoxResults()
这是关键词。问题是您使用了 ReadExisting()。串行端口非常慢,您的 DataReceived 事件处理程序通常只会获取一两个字符。通过显示消息框,您减慢了速度。这允许串行端口驱动程序读取更多 个字符。 ReadExisting 足以读取整个“Connected”字符串,而不仅仅是“C”或“Co”。
当您使用调试器时也很难诊断,单步执行代码也会减慢它的速度以允许端口获得足够的字符。
您需要做的是在获得整个响应字符串后仅 处理响应。使用调制解调器总是很容易,只需使用 ReadLine() 而不是 ReadExisting()。您可能需要调整 NewLine 属性的值。
关于c# - 串行数据仅适用于消息框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12187652/