ELM327发送多个命令时没有返回任何内容

3
我正在开发一个与我的ELM327交互的WPF应用程序,通过蓝牙连接到我的电脑并成功建立连接。
当我手动逐个发送命令(例如"010C\r")时,它会正确地返回我的汽车转速的值("010C\r41 0C 0C 30 \r")。
然后我尝试每三秒钟发送一次该命令。第一次有时可以正常工作,如果第二次发送,则ELM327不返回任何内容。如果我逐步调试它,ELM会正确地返回值,没有任何错误。我认为读取器在ELM有时间发送响应之前就读取了响应。 循环部分:
private async Task InitializeElm327()
    {
        string answer = string.Empty;

        tbx_dump.Text += "\n\nSetting up Reader and Writer";
        SetupReaderWriter();
        tbx_dump.Text += "\nReader and Writer setup finished";

        while (true)
        {
            int revs = await GetRPM();
            tbx_revs.Text = revs.ToString();
            System.Threading.Thread.Sleep(3000);
        }
    }
返回RPM值的函数:
private async Task<int> GetRPM()
    {
        string cmdAnswer = await SendCommand("010C\r");
        int rpm = ConvertRPM(cmdAnswer);
        return rpm;
    }
发送命令的函数:
private async Task<string> SendCommand(string command)
    {
        tbx_dump.Text += "\n\nSending command " + command + " to Elm327";
        m_dataWriter.WriteString(command);
        await m_dataWriter.StoreAsync();
        await m_dataWriter.FlushAsync();
        uint count = await m_dataReader.LoadAsync(512);
        return m_dataReader.ReadString(count).Trim('>');
    }

有没有办法防止这种情况发生?

2
System.Threading.Thread.Sleep(3000); 你尝试过使用await Task.Delay(3000);替代吗? - Fildor
2
我还会使用 Progress 来确保 UI 元素在 UI 线程上访问。 - Fildor
2
@Fildor 很抱歉回复晚了,我今天才有时间尝试它。在 ECU 模拟器上运行良好,今晚我会尝试在我的车上测试。谢谢 :) - user13575187
1
@reithoufr,你用的是哪个库?看起来像是直接访问BT堆栈而不是通过虚拟串口? - Falco Alexander
1个回答

2
如fildor所评论的那样,错误在于System.Threading.Thread.Sleep(3000);。我只需用await Task.Delay(3000);替换它,现在它可以正确返回RPM了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接