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-порт получает данные, и я проверил его с другими программами, и он считывает все данные, которые мне нужны.

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


person user123_456    schedule 10.09.2012    source источник
comment
Какую ошибку вы получаете в этой строке? Каково значение data в ответе от GetValue(obdMessage);? Любая ошибка, которую вы получите из упомянутой вами строки, будет связана с манипулированием строкой или невозможностью преобразовать значение в int. Действительно ли data состоит из трех частей после того, как вы разделили пространство?   -  person itsmatt    schedule 10.09.2012
comment
да, я получаю ошибку строки, потому что я получаю другую строку, которую должен получить. И мне нужно знать, почему я получаю ошибку инициализации шины от своего адаптера.   -  person user123_456    schedule 10.09.2012


Ответы (1)


Я вижу, вам звонят:

System.Threading.Thread.Sleep(100);

в вашем коде.

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

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

person itsmatt    schedule 10.09.2012
comment
привет, на самом деле у меня есть эта часть кода, которая вызывает мою функцию каждые 600 мс. Код while (td.IsAlive){ eng.GetSpeedKmh();} - person user123_456; 10.09.2012
comment
Я предполагаю, что sp.Write относится к вызову SerialPort.Write(). Это правильно? Если да, правильно ли настроен последовательный порт, например, скорость передачи и т. д.? Ссылка: msdn.microsoft.com/en-us/ библиотека/ - person itsmatt; 11.09.2012