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мс?
Похоже, ваш код полагается на то, что происходит в течение определенного промежутка времени, и на самом деле этого может быть недостаточно для выполнения этого действия.