контрольная сумма nmea в c # .net cf - PullRequest
2 голосов
/ 23 февраля 2011

Я пытаюсь написать свой собственный синтаксический анализатор nmea, так как мне нужна только некоторая информация из GPS, и не нужно интерпретировать все сообщения.Проблема, которая у меня есть, заключается в том, что мой валидатор сообщений Nmea дает мне неправильную контрольную сумму.Может кто-то видит, что я ошибаюсь?

Я использую идею из Codepedia - Расчет и проверка предложений nmea .

    // Returns True if a sentence's checksum matches the 
    // calculated checksum
    // Calculates the checksum for a sentence
    private static bool IsValid(string sentence)
    {
        if (sentence == "")
            return false;
        if (sentence.Length < 14)
            return false;
        try
        {
            string[] Words = GetWords(sentence);
            Log.writeToLog(Words);
            int checksum = 0;
            string CheckToCompare = Words[Words.Length - 1];
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i < (Words.Length - 2); i++)
            {
                sb.Append(Words[i]);
            }
            string sentecenToParse = sb.ToString();

            foreach (char charY in sentecenToParse)
            {
                checksum ^= Convert.ToByte(charY);
            }


            Log.writeToLog("Checksum: " + checksum.ToString("X2"));
            Log.writeToLog("Obtained CheckSum: " + CheckToCompare);
            return String.Equals(checksum.ToString("X2"), CheckToCompare, StringComparison.OrdinalIgnoreCase);
        }
        catch (Exception exc)
        {
            Log.writeToLog("Exception caused by sentence:" + sentence);
            Log.writeToLog("Exception error message: " + exc.Message);
            return false;
        }


    }

    // Divides a sentence into individual Words
    public static string[] GetWords(string sentence)
    {
        char[] separator = { ',', '*' };
        return sentence.Split(separator);
    }

ВыполнитьLOG

10:30:07 23-02-2011 Opening Port
10:30:08 23-02-2011 Opened Port
10:30:10 23-02-2011 Processing Data
10:30:12 23-02-2011 $GPGGA
10:30:12 23-02-2011 102957.92
10:30:12 23-02-2011 4104.8569
10:30:12 23-02-2011 N
10:30:12 23-02-2011 00836.4700
10:30:12 23-02-2011 W
10:30:12 23-02-2011 1
10:30:12 23-02-2011 4
10:30:12 23-02-2011 15.100
10:30:12 23-02-2011 157.133
10:30:12 23-02-2011 M
10:30:12 23-02-2011 52.386
10:30:12 23-02-2011 M
10:30:12 23-02-2011 0
10:30:12 23-02-2011 0
10:30:13 23-02-2011 79

10:30:13 23-02-2011 Checksum: 6D
10:30:13 23-02-2011 Obtained CheckSum: 79

10:30:13 23-02-2011 Invalid sentence
10:30:13 23-02-2011 $GPRMC
10:30:13 23-02-2011 102957.92
10:30:13 23-02-2011 A
10:30:13 23-02-2011 4104.8569
10:30:13 23-02-2011 N
10:30:13 23-02-2011 00836.4700
10:30:13 23-02-2011 W
10:30:13 23-02-2011 0.000
10:30:13 23-02-2011 5.822
10:30:13 23-02-2011 230211
10:30:13 23-02-2011 0
10:30:13 23-02-2011 W
10:30:14 23-02-2011 A
10:30:14 23-02-2011 2B

10:30:14 23-02-2011 Checksum: 4E
10:30:15 23-02-2011 Obtained CheckSum: 2B
10:30:15 23-02-2011 Invalid sentence

Ответы [ 4 ]

4 голосов
/ 23 февраля 2011

Если вы используете эту функцию со страницы, на которую вы ссылаетесь:

private static string getChecksum(string sentence)
{
  //Start with first Item
  int checksum= Convert.ToByte(sentence[sentence.IndexOf('$')+1]);
  // Loop through all chars to get a checksum
  for (int i=sentence.IndexOf('$')+2 ; i<sentence.IndexOf('*') ; i++)
  {
    // No. XOR the checksum with this character's value
    checksum^=Convert.ToByte(sentence[i]);              
  }
  // Return the checksum formatted as a two-character hexadecimal
  return checksum.ToString("X2");
}

И передайте строку, с $ a начало и * в конце (до контрольной суммы) и запятые между словами,это работает.

string s1 = getChecksum("$GPGGA,102957.92,4104.8569,N,00836.4700,W,1,4,15.100,157.133,M,52.386,M,0,0*79");
string s2 = getChecksum("$GPRMC,102957.92,A,4104.8569,N,00836.4700,W,0.000,5.822,230211,0,W,A*2B");

s1 = 79 и s2 = 2B, как и следовало ожидать.

2 голосов
/ 23 февраля 2011

Проблема не в том, что вы отбрасываете все символы ',' при вычислении контрольной суммы.Они должны быть включены, насколько я вижу.Поэтому вычислите контрольную сумму для исходной строки, с которой вы не удалили запятые, и она может работать лучше ...

0 голосов
/ 02 марта 2013

Во многих случаях проверка соответствия контрольной суммы является пустой тратой времени.Это действительно только (незначительно) полезно, когда источник и приемник предложений NMEA разделены последовательным кабелем, который может быть шумным.Если источник и приемник находятся в одном устройстве и обмениваются данными через общую память, контрольная сумма всегда будет правильной.

0 голосов
/ 25 февраля 2013

Вот пример, который вычисляет контрольную сумму за один раз (разбор предложения).https://code.google.com/p/avr-nmea-gps-library/ Вы, вероятно, не можете сделать это быстрее, чем это.

...