ELM327 ничего не возвращает при отправке нескольких команд - PullRequest
2 голосов
/ 09 июля 2020

Я разрабатываю приложение WPF, которое взаимодействует с моим ELM327. Он подключен к моему P C через bluetooth и может успешно установить sh.

Когда я вручную отправляю одну команду за раз (например, «010C \ r»), он правильно возвращает мне число оборотов в минуту. моей машины ("010C \ r41 0 C 0 C 30 \ r").

Затем я попытался отправлять команду каждые три секунды. В первый раз иногда срабатывает, если во второй раз отправляется, ELM327 ничего не возвращает. Если я отлажу его шаг за шагом, значения будут возвращены ELM правильно без каких-либо ошибок. Я думаю, что читатель читает ответ, прежде чем ELM успевает его отправить.

l oop:

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);
        }
    }

Функция который возвращает число оборотов в минуту:

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 Ответ

1 голос
/ 30 июля 2020

Как прокомментировал филдор, ошибка была System.Threading.Thread.Sleep(3000);

Я просто заменил его на await Task.Delay(3000);, и теперь он правильно возвращает число оборотов в минуту.

...