7

シリアル ポート経由で Arduino からいくつかの値を取得しています。データの形式は次のとおり "value1,value2,value3\r"ですstring

"4.5,550.0,0.02\r"

値を受け取って分離することはできますが、それらを変換しようとするとdouble、次の例外が発生します

「入力文字列の形式が正しくありませんでした」`.

double Battery = 0, Voltage = 0, Current = 0;

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    string data = serialPort1.ReadLine();
    string bv = data.Substring(0, data.IndexOf(",") - 1);
    data = data.Substring(data.IndexOf(",") + 1);
    string v0 = data.Substring(0, data.IndexOf(",") - 1);
    data = data.Substring(data.IndexOf(",") + 1);
    string i = data;

    double batteryVoltage = Convert.ToDouble(bv);
    double V0 = Convert.ToDouble(v0);
    double I = Convert.ToDouble(i);

    Battery = batteryVoltage;
    Voltage = V0;
    Current = I;

}
4

4 に答える 4

11

ここで 2 つのことが問題になります。まず、地域設定 (無効な小数点文字) が原因で変換が失敗する可能性があるため、追加のパラメーターとして名前空間CultureInfo.InvariantCultureから使用します。System.Globalization2 つ目は、部分文字列から 1 文字を切り取っているので、 を削除してください-1

string data = "4.5,550.0,0.02\r";
string bv = data.Substring(0, data.IndexOf(","));
data = data.Substring(data.IndexOf(",") + 1);
string v0 = data.Substring(0, data.IndexOf(","));
data = data.Substring(data.IndexOf(",") + 1);
string i = data;

double batteryVoltage = Convert.ToDouble(bv, CultureInfo.InvariantCulture);
double V0 = Convert.ToDouble(v0, CultureInfo.InvariantCulture);
double I = Convert.ToDouble(i, CultureInfo.InvariantCulture);
于 2013-09-18T09:53:37.320 に答える
0

これを試して文字列を分割してください

 string[] separotrs = { ",", "\r" };
 string[] result= aurdino.Split(separotrs, StringSplitOptions.RemoveEmptyEntries);

       double batteryVoltage = Convert.ToDouble(result[1]); //Sorry if order is incorrect:-)
       double v0 = Convert.ToDouble(result[0]);
       double I = Convert.ToDouble(result[2]);

私が得られないことの1つは、正確にどこでエラーが発生しているのかということですが、メソッドは正しい数値をフェッチしません(最後の値を切り取ります)。変数i ( ) は、処理されるものCurrentをフェッチし、現在の値として取得しますただし、他の値は間違っていますが、例のようにこのメソッドでエラーが発生しているとは思いません。0.02\rConvert.ToDouble0.02

こちらをご覧ください

于 2013-09-18T10:21:49.150 に答える
0

あなたのコードは、提供された入力例で機能します。例外について詳しく教えてください。

変換で CultureInfo を指定してみてください。

また、次のString.Split()方法を使用する必要があります。

string data = "4.5,550.0,0.02\r";
var strings = data.Split(',');
var doubles = strings.Select(s => Convert.ToDouble(s, CultureInfo.InvariantCulture)).ToList();

double batteryVoltage = doubles[0];
double V0 = doubles[1];
double I = doubles[2];
于 2013-09-18T09:48:36.860 に答える
0

\r 文字が問題を引き起こしている可能性があります。処理する前にトリミングしてみてください。

于 2013-09-18T09:49:12.083 に答える