我通过串口从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;
}
答案 0 :(得分:6)
这里有两件事是个问题。首先,由于区域设置(无效的小数点字符),转换可能会失败,因此请使用CultureInfo.InvariantCulture
命名空间中的System.Globalization
作为附加参数。第二件事,你要从子串中切掉一个字符,所以删除-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);
答案 1 :(得分: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];
答案 2 :(得分:0)
\ r \ n char可能导致问题。在处理之前尝试修剪它。
答案 3 :(得分: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]);
我不知道的一件事是你究竟在哪里得到错误但是你的方法无法获取正确的数字(切断最后一个值),而你变量我(Current
)将获取由0.02\r
处理的Convert.ToDouble
并且您将获得0.02
作为您的当前值,但是其他值将是错误的,但我不认为您在此方法上收到错误根据你的例子。