c# - ELM327 发送多个命令时不返回任何内容

标签 c# wpf obd-ii elm327

我正在开发一个与我的 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('>');
    }

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

最佳答案

正如 fildor 评论的那样,错误是 System.Threading.Thread.Sleep(3000);

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

关于c# - ELM327 发送多个命令时不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62811460/

相关文章:

c# - 为什么我在调用 ContextRegistry.GetContext() 时收到 Spring.NET 引发的异常?

android - 让 Android 同时使用 WiFi 与设备对话,并使用移动数据与服务器对话?

android - obd适配器的初始化

c# - 将 Java GUI 转换为 C# WPF

c# - 使用 Assembly.ReflectionOnlyLoadFrom 加载 WPF 项目引用的程序集时出现奇怪的 FileLoadException

c# - 为什么 dapper 在执行选择时为 Guid 返回全零,但表中的 guid 值设置正确?

wpf - 数据触发器绑定(bind)未按预期工作

android - 如何与连接到汽车的单个 Obd2 蓝牙设备建立多个连接

c# - 使用 fluentmigrator 用每行的新值更新行数据

c# - 如何使 ToolStrip 按钮立即可点击而无需先点击表单?