发送多个命令时,ELM327不返回任何内容

时间:2020-07-09 09:14:42

标签: c# wpf obd-ii elm327

我正在开发与我的ELM327交互的WPF应用程序。它通过蓝牙连接到我的PC,并且能够成功建立它。

当我一次手动发送一个命令(例如“ 010C \ r”)时,它会正确地向我返回汽车的RPM(“ 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('>');
    }

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

1 个答案:

答案 0 :(得分:1)

正如fildor所说,错误是System.Threading.Thread.Sleep(3000);

我只是将其替换为await Task.Delay(3000);,现在它正确地返回了RPM。