Проблемы с анализом данных NMEA из последовательного порта - PullRequest
1 голос
/ 18 апреля 2010

Я получаю предложения 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 не перехватит? Это $? Как мне с этим справиться?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Прошло много времени с тех пор, как я прочитал 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);
        }
1 голос
/ 18 апреля 2010

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

NMEA Wiki

0 голосов
/ 26 мая 2010

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

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

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