簡體   English   中英

在C#.net cf中的nmea校驗和

[英]nmea checksum in c# .net cf

我正在嘗試編寫自己的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);
    }

運行日志

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

如果您從鏈接的頁面使用此功能:

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");
}

並傳入您的字符串,以$開頭,*末尾(在校驗和之前),單詞之間用逗號分隔,就可以了。

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。

計算校驗和時丟棄所有的','字符不是問題。 據我所知,應該將它們包括在內。 因此,對尚未刪除逗號的原始字符串計算校驗和,可能會更好...

這是一個一次性計算校驗和的示例(句子的單個解析)。 https://code.google.com/p/avr-nmea-gps-library/您可能做不到比這更快的速度。

在許多情況下,確保校驗和匹配只是浪費時間。 當NMEA語句的源和接收端被可能有噪聲的串行電纜分開時,它實際上(僅)有用。 如果源和接收器在同一設備中,並通過共享內存進行通信,則校驗和將始終正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM