2010-04-18 4 views
1

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

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

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

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

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

+0

Вы уверены, что указали строку источника точно так же, как она входит в вашу переменную sBuffer? Может быть, перед запятой есть пробел? Или какие-то другие незначительные несоответствия? Также попробуйте установить точку останова в инструкции foreach. Когда он попадает, добавьте и sBuffer и Words в часы отладки, затем разверните Words, а затем снимите с экрана и опубликуйте его здесь. –

+0

О, и забыл добавить: нет, знак доллара не может иметь к этому никакого отношения. –

+0

Убедитесь, что в нем нет каких-либо непечатаемых управляющих символов, например. блуждающий символ LF, оставшийся от чтения до CR на предыдущей строке. –

ответ

2

Это было некоторое время, так как я прочитал 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 выводит кроме минутных данных, 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); 
     } 
0

EDIT: Мой ответ под никакого улучшения, как заявил комментатор mtrw, то == перегружен классом строки. Я был неправ.

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

+0

Перегрузка классов .NET string == для вызова 'Equals'. См. Http://www.yoda.arachsys.com/csharp/strings.html – mtrw

+0

Хорошо, я предполагал, не проверял. Спасибо mtrw! Тогда ответ Дрюка в порядке. Должен быть отмечен ответ. Отредактировал сообщение. – rdoubleui

Смежные вопросы