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

这里有两个问题。首先,由于区域设置(无效的小数点字符)可能会导致转换失败,因此请使用CultureInfo.InvariantCulturefrom System.Globalizationnamespace 作为附加参数。第二件事,您要从子字符串中删除一个字符,因此请删除-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]);

我没有得到的一件事是你到底在哪里得到错误但是你的方法不会获取正确的数字(切断最后一个值),你的变量i ( Current) 将获取0.02\r它将被处理Convert.ToDouble并且你将得到0.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 回答