[英]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.