Фильтрация возврата по последовательному порту - PullRequest
0 голосов
/ 21 июня 2019

У меня есть датчик CO2 на моем Arduino Mega и иногда случайно, когда я читаю измерение CO2, датчик возвращает «?». Знак вопроса приводит к сбою моей программы и возвращает «входная строка была не в правильном формате».

Я ничего не пробовал, потому что я не знаю, какой подход будет лучшим для этого. Датчик CO2 возвращает результат измерения в форме «Z 00000», но когда появляется этот вопросительный знак, он показывает, что все, что было возвращено, было «\ n». В настоящее время у меня есть программа, которая просто читает 5 цифр после Z.

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

То, что я ожидаю вернуть, это цифры после Z, которые работают, но время от времени я получаю случайный возврат строки, которая приводит к сбою.

1 Ответ

0 голосов
/ 21 июня 2019

Согласно документации C # метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...