OBD2给我一个总线初始化错误

时间:2012-09-10 10:57:13

标签: c# winforms string bus obd-ii

我正在使用C#构建一个与其他OBD2阅读器应用程序类似的应用程序。

我测试了一个OBD2适配器,它连接了蓝牙端口到我的电脑。 我正在使用以下程序“Torque”测试此适配器,我必须说该程序工作得非常好。我正在阅读所有参数。 我甚至使用在PC上创建虚拟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端口正在获取数据,我已经用其他程序测试了它,它正在读取我需要的所有数据。

我试图谷歌它,我找不到任何可以解决我的问题。

1 个答案:

答案 0 :(得分:0)

我看到你打电话给:

System.Threading.Thread.Sleep(100);

代码。

我对OBD2适配器的接口知之甚少,但似乎在这里假设100ms有足够的时间进行sp.Write(pid + "\r")调用。如果你撞到200毫秒会发生什么? 500ms的?

似乎您的代码依赖于在给定时间内发生的事情,事实上,这可能不足以让该行动发生。