c# - 串行数据仅适用于消息框

标签 c# visual-studio-2010 serial-port

在我通过串行端口接收数据的处理程序中,当接收到数据时,我将其存储到一个字符串中并进行 .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/

相关文章:

c# - 两种 MAC 地址检索方法返回两个不同的 MAC 地址

c# - 如何在 WPF 用户控件库项目中使用 MVVM Light?

C# Parallel.For 意想不到的结果

c# - WP7 : Styling ListBox items

c++ - Visual Studio 2010 Intellisense 抛出虚假错误

c++ - 在 .ico 文件中选择特定图标

javascript - 使用 Chrome 应用程序阅读连续剧

linux - Linux 中的虚拟 COM 驱动程序用于从 USB 设备接收数据

serial-port - socat创建的虚拟串口对二进制数据丢失0xF和0x16

c# - 日志语句避免计算参数