我的Arduino Mega上有一个CO2传感器,有时在读取CO2测量值时会随机出现,该传感器将返回“?”。问号导致我的程序崩溃并返回“输入字符串的格式不正确”。
我什么也没尝试,因为我不知道哪种方法最适合。 CO2传感器以“ Z 00000”的形式返回测量值,但是当出现此问号时,它表示返回的全部是“ \ n”。目前,我的程序仅读取Z之后的5位数字。
if (returnString != "")
{
val = Convert.ToDouble(returnString.Substring(returnString.LastIndexOf('Z')+ 1));
}
我希望返回的是Z后面的数字,该数字可以正常工作,但我经常会得到一个随机的行返回值,从而使所有内容崩溃。
答案 0 :(得分:0)
根据C# documentation,只要输入字符串无效,ToDouble方法就会引发FormatException。您应该捕获异常以避免进一步的问题。
try {
val = Convert.ToDouble(returnString.Substring(returnString.LastIndexOf('Z')+ 1));
}
catch(FormatException e) {
//If you want to do anything in case of an error
//Otherwise you can leave it blank
}
我还建议您使用某种状态机来解析您的情况下的数据,这可能会丢弃所有无效字符。像这样:
bool z_received = false;
int digits = 0;
int value = 0;
//Called whenever you receive a byte from the serial port
void onCharacter(char input) {
if(input == 'Z') {
z_received = true;
}
else if(z_received && input <= '9' && input >= '0') {
value *= 10;
value += (input - '0');
digits++;
if(digits == 5) {
onData(value);
value = 0;
z_received = false;
digits = 0;
}
}
else {
value = 0;
z_received = false;
digits = 0;
}
}
void onData(int data) {
//do something with the data
}
这只是一个模型,如果您可以将COM端口的字节流定向到onCharacter函数中,则应该可以使用。