OBD2 дает мне ошибку инициализации шины

Я работаю с C# для создания приложения, которое будет похоже на другие приложения чтения OBD2.

Я протестировал адаптер OBD2, который подключен через порт Bluetooth к моему ПК. Я тестировал этот адаптер с помощью следующей программы " Torque", и я должен сказать, что программа работает очень хорошо. Я читаю все параметры. Я даже тестировал его с помощью программы, которая создает виртуальный COM-порт на ПК и имеет цикл, который дает мне несколько разных состояний и сообщений, и с этим моя программа работает правильно, без ошибок.

Так что моя проблема возникает, когда я получаю первое сообщение от моей машины.

Эта часть кода на самом деле получает PID из машины. И в этом примере PID, который я получаю, имеет следующий формат: 010D Bus..init error (Я уверен, что это сообщение, но я не уверен, что это в оригинальном формате, возможно, на одну точку больше или меньше).

private string GetValue(string pid)
        {
            sp.Write(pid + "\r");
            System.Threading.Thread.Sleep(100);
            const int buffSize = 1024;
            bool cont = true;
            int count = 0;
            byte[] bff = new byte[buffSize];
            string retVal = string.Empty;
            while (cont)
            {
                count = sp.Read(bff, 0, buffSize);
                retVal += System.Text.Encoding.Default.GetString(bff, 0, count);
                if (retVal.Contains(">"))
                {
                    cont = false;
                }
            }
            return retVal.Replace("\n", "");
        }

Тогда я иду в этой функции:

public int? GetSpeedKmh()
        {
            CheckSerialPort();
            const string obdMessage = "010D";
            if (OnGetSpeedInit != null)
                OnGetSpeedInit(new OBDIIEngineEventArgs(null, obdMessage));
            string data = GetValue(obdMessage);
            int? retVal = (data.Contains("NO DATA")) ? null : (int?)Convert.ToInt32(data.Split(' ')[2].Replace("\r>", string.Empty), 16);
            if (OnGetSpeedDone != null)
                OnGetSpeedDone(new OBDIIEngineEventArgs(retVal, obdMessage, data.Contains("NO DATA")));
            return retVal;
        }

Теперь ошибка происходит в этой строке:int? retVal = (data.Contains("NO DATA")) ? null : (int?)Convert.ToInt32(data.Split(' ')[2].Replace("\r>", string.Empty), 16);

Потому что я получаю сообщение об ошибке инициализации шины, и оно не может определить, что написано.

Так что я могу сделать, чтобы исправить эту программу? У кого-нибудь есть подобная проблема? Я уверен, что адаптер OBD2 работает, COM-порт получает данные, и я протестировал его с другими программами, и он считывает все данные, которые мне нужны.

Я пытался найти его в Google и не могу найти ничего, что могло бы решить мою проблему.

1 ответ

Я вижу, у вас есть звонок:

System.Threading.Thread.Sleep(100);

в вашем коде.

Я ничего не знаю о взаимодействии с адаптером OBD2, но кажется, что здесь делается предположение, что для этого достаточно 100 мс. sp.Write(pid + "\r") вызов, чтобы иметь место. Что произойдет, если вы столкнетесь с этим до 200 мс? 500мс?

Похоже, ваш код полагается на то, что происходит в течение определенного промежутка времени, и на самом деле этого может быть недостаточно для выполнения этого действия.

Другие вопросы по тегам