0

私は C# を使用して、他の OBD2 リーダー アプリケーションと同様のアプリケーションを構築しています。

Bluetooth ポートを介して PC に接続されている OBD2 アダプターをテストしました。このアダプターを次のプログラム「Torque」でテストしましたが、プログラムは非常にうまく機能していると言わざるを得ません。私はすべてのパラメータを読んでいます。PCで仮想COMポートを作成し、いくつかの異なる状態とメッセージを表示するループを持つプログラムでテストしていましたが、プログラムはエラーなしで正しく動作しています。

そのため、車から最初のメッセージを受け取ったときに問題が発生しています。

コードのこの部分は、実際に車からPIDを取得します。そして、私が取得しているこの例の PID は、次の形式になっています: 010D Bus..init エラー(これはメッセージであると確信していますが、これが元の形式であるかどうかはわかりません。おそらく 1 ドット多かれ少なかれ)。

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

次の宛先に電話がありました。

System.Threading.Thread.Sleep(100);

あなたのコードで。

OBD2 アダプターとのインターフェイスについては何も知りませんが、ここでは、そのsp.Write(pid + "\r")呼び出しが行われるのに 100 ミリ秒で十分であると想定されているようです。それを 200ms まで上げるとどうなりますか? 500ミリ秒?

あなたのコードは、特定の時間内に起こっていることに依存しているように見えますが、実際には、そのアクションが発生するのに十分な長さではない可能性があります.

于 2012-09-10T15:40:18.667 に答える