串口过滤返回

时间:2019-06-21 15:07:49

标签: visual-studio arduino

我的Arduino Mega上有一个CO2传感器,有时在读取CO2测量值时会随机出现,该传感器将返回“?”。问号导致我的程序崩溃并返回“输入字符串的格式不正确”。

我什么也没尝试,因为我不知道哪种方法最适合。 CO2传感器以“ Z 00000”的形式返回测量值,但是当出现此问号时,它表示返回的全部是“ \ n”。目前,我的程序仅读取Z之后的5位数字。

if (returnString != "")
{
    val = Convert.ToDouble(returnString.Substring(returnString.LastIndexOf('Z')+ 1));
}

我希望返回的是Z后面的数字,该数字可以正常工作,但我经常会得到一个随机的行返回值,从而使所有内容崩溃。

1 个答案:

答案 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函数中,则应该可以使用。