0

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

我已经测试了一个通过蓝牙端口连接到我的 PC 的 OBD2 适配器。我正在使用以下程序“ Torque ”测试此适配器,我必须说该程序运行得非常好。我正在阅读所有参数。我什至正在使用在 PC 上创建虚拟 COM 端口并具有循环的程序对其进行测试,该循环为我提供了一些不同的状态和消息,并且我的程序可以正常工作而没有错误。

因此,当我从车上收到第一条消息时,我的问题就出现了。

这部分代码实际上是从汽车中获取PID 。在这个例子中,我得到的 PID 是这种格式:010D Bus..init 错误(我确定这是一条消息,但我不确定这是否是原始格式,可能或多或少一个点)。

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 端口正在获取数据,并且我已经用其他程序对其进行了测试,它正在读取我需要的所有数据。

我试图用谷歌搜索它,但找不到任何可以解决我问题的东西。

4

1 回答 1

0

I see you've got a call to:

System.Threading.Thread.Sleep(100);

in your code.

I don't know anything about interfacing with an OBD2 adapter but it seems like an assumption is being made here that 100ms is enough time to for that sp.Write(pid + "\r") call to take place. What happens if you bump that up to 200ms? 500ms?

Seems like your code is relying upon things happening within a given amount of time and that might, in fact, not be long enough for that action to take place.

于 2012-09-10T15:40:18.667 回答