Проблемы с анализом данных NMEA из последовательного порта

Я получаю предложения NMEA от последовательного GPS. Затем струны появляются, как я и ожидал. Проблема в том, что при разборе такого предложения:

$GPRMC,040302.663,A,3939.7,N,10506.6,W,0.27,358.86,200804,,*1A

Я использую простой фрагмент кода, чтобы убедиться, что у меня правильный ответ:

        string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            if (item == "$GPRMC")
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }
        }

Я добавил возврат в это место для примера. Я распечатал результаты разделения в текстовом поле и увидел, что $ GPRMC действительно встречается в переменной item в какой-то момент. Если строка встречается, почему оператор if не улавливает? Это $? Как я могу решить эту проблему?


person rross    schedule 18.04.2010    source источник
comment
Вы уверены, что указали исходную строку именно в том виде, в каком она входит в вашу переменную sBuffer? Может быть, перед запятой стоит пробел? Или еще какие-то мелкие неточности? Также попробуйте установить точку останова в операторе foreach. Когда он попадет, добавьте и sBuffer, и слова в часы отладчика, затем разверните слова, а затем сделайте снимок экрана и разместите его здесь.   -  person Fyodor Soikin    schedule 18.04.2010
comment
Да, и забыл добавить: нет, знак доллара не может иметь к этому никакого отношения.   -  person Fyodor Soikin    schedule 18.04.2010
comment
Убедитесь, что там нет никаких непечатаемых управляющих символов, например случайный символ LF, оставшийся от чтения до CR в предыдущей строке.   -  person Ian Mercer    schedule 18.04.2010


Ответы (3)


Прошло много времени с тех пор, как я читал NMEA GPS ...

Разве вам не нужно сравнивать подстроку, соответствующую типу данных NMEA, а не все элементы буфера NMEA? Метод .Split разбивает sBuffer на все запятые в предложении NMEA, чтобы у вас был каждый отдельный элемент. Но затем вы проверяете подстроку против первого элемента в цикле, который подразумевает, что вы хотите просмотреть каждый элемент. Непонятно ...

Разве ваш тест не выглядел бы лучше:

string[] Words=sBuffer.Split(',');
if(String.Compare(Words[0],"$GPRMC")==0) 
            {
                return "Correct Sentence";
            }
            else
            {
                return "Incorrect Sentence
            }

Есть ли вероятность, что поток NMEA выводит предложения, отличные от предложений Min Data, GPRMC, и вам нужно перечитать, пока не получите правильное предложение? Кроме того, вы уверены, что ваш GPS имеет тип данных $GPRMC, а не GPRMC? Я не думаю, что в типе данных должно быть $.

т.е. псевдо:

do {
  buffer=read_NMEA();  //making sure the entire sentence is read...
  array=split(buffer,",");
  data_type=buffer[0];
}
while(data_type!="GPRMC" || readcount++<=MAX_NMEA_READS)

Чтобы отладить цикл, попробуйте записать элементы в консоли:

string[] Words = sBuffer.Split(',');
        foreach (string item in Words)
        {
            Console.WriteLine(item);
        }
person dawg    schedule 18.04.2010

Вы подсчитываете контрольную сумму, я ее не вижу.

NMEA Wiki

person dbasnett    schedule 18.04.2010

РЕДАКТИРОВАТЬ: Мой ответ ниже не является улучшением, как заявил комментатор mtrw, == перегружен строковым классом. Я был неправ.

На мой взгляд, ваше if-заявление неверно. Используя оператор ==, вы проверяете, является ли это той же ссылкой (что, конечно, не так). Чтобы просто сравнить, содержат ли две строки одно и то же значение, используйте String.Equals().

person rdoubleui    schedule 26.05.2010
comment
Класс строки .NET перегружает == для вызова Equals. См. yoda.arachsys.com/csharp/strings.html. - person mtrw; 26.05.2010
comment
Ладно, предполагал, не проверял. Спасибо, mtrw! Тогда ответ Дрюка в порядке. Должен быть отмечен ответ. Пост тоже редактировал. - person rdoubleui; 26.05.2010