C# .net cf 中的 nmea 校验和

2024-03-22

我正在尝试编写自己的 nmea 解析器,因为我只需要来自 GPS 的一些信息,并且不需要解释所有消息。我遇到的问题是我的 nmea 消息验证器给了我一个错误的校验和。有人能看到我做错了什么吗?

我正在使用这个想法Codepedia - 计算和验证 nmea 句子 http://www.codepedia.com/1/Calculating+and+Validating+NMEA+Checksums.

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

Run 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

如果您从链接的页面使用此功能:

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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# .net cf 中的 nmea 校验和 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 如何将某些特定的短信内容复制到剪贴板? [复制]

    这个问题在这里已经有答案了 每当我想输入检查帐户时 与我合作的银行都会向我发送一条短信 其中包含随机生成的六位数代码 而且每次手动打字真的很累 我正在考虑制作一个小应用程序 以便将六位数字复制到剪贴板中 以便每当短信到达时我立即将其粘贴到相
  • 当配置文件未激活时包括 Bean 定义

    在我的应用程序中我使用了几个profiles http blog springsource com 2011 02 14 spring 3 1 m1 introducing profile 使某些 bean 适合自动装配 我缺少的是当某个配
  • mysqli_num_rows 无论如何都会返回 1 [重复]

    这个问题在这里已经有答案了 当我在 phpMyAdmin 中进行 SQL 搜索 用变量替换实际值 时 它会返回正确的行号 但是当使用 PHP 返回该值时 无论如何它总是返回 1 提前致谢 function user exists usern
  • 如何为钩子创建蹦床函数

    我对挂钩很感兴趣 我决定看看是否可以挂钩一些函数 我对使用 detours 这样的库不感兴趣 因为我想拥有自己做的经验 通过我在互联网上找到的一些资源 我能够创建下面的代码 这是基本的 但效果还不错 然而 当挂钩由多个线程调用的函数时 它被
  • 寻找在本地磁盘上存储数据的想法

    我在 XML 文件中存储了大量数据 大小为 173 MB 460 万行 并将其存储在 Windows 窗体应用程序的工作目录中 它是将数据表写入 XML 文件的结果 数据表最初是通过对 SQL 服务器的查询填充的 我将其存储在本地而不是从服
  • 使用 apache tika 获取 doc 文件中的嵌入资源

    我有包含文本和图像的 MS Word 文档 我想解析它们以获得 xml 结构 经过研究 我最终使用 apache tika 来转换我的文档 我可以将我的文档解析为 xml 这是我的代码 AutoDetectParser parser new
  • AVPlayerStatus 与 AVPlayerItemStatus

    问题是玩家状态返回AVPlayerStatusReadyToPlay在player currentItem status返回之前整整2秒AVPlayerItemStatusReadyToPlay 有人对为什么会发生这种情况有任何有用的解释吗
  • 通过类构造函数初始化成员变量STL向量

    我有以下代码似乎可以工作 class MapCell public int x y z void Test3DVector int size x int size y int size z vector lt vector lt vecto
  • 如何测试 Phoenix 套接字是否已终止?

    我正在寻找一种方法来测试套接字是否被终止 被测试的代码执行以下操作 def handle in logout payload socket do stop logout socket gt assign user nil end 和我的测试
  • Apache 反向代理 https 到 http

    我已经在这里和互联网上进行了大量的浏览 但我无法配置我的 apache 将 https 反向代理为 http 不过我觉得我已经很接近了 我遵循的所有示例似乎都适用于除我之外的每个人 而且我的设置非常简单
  • RuntimeError:应用程序“目录”中的“product_product_options”模型发生冲突

    版本信息 Python 3 4 Django 1 8 Oscar Commerce 版本 1 2 1 最终 我正在尝试定制Products在目录应用程序中文档 http django oscar readthedocs io en rele
  • 关于雪花中 util_db 的任何好的文档

    我正在寻找有关雪花中 util db 用途的信息 该帐户随数据库一起提供 找不到这方面的好的文档 UTIL DB 是初始帐户设置的一部分 包含一些用于加载数据的示例文件格式 这不使用任何数据存储 因此不会对您的帐户产生存储费用 如果需要 帐
  • 将实体框架代码优先中的 SQL Server 数据库字母列排序更改为顺序

    我需要首先关闭代码中的字母顺序 这是我的简化课程 public class Person Key Column PersonId public int Id get set MaxLength 50 public string Person
  • 无法使用 Az DevOps Pipelines API 6.0-preview.1 创建新管道

    我正在尝试使用此 API 端点创建新的管道 POST https dev azure com organization project apis pipelines api version 6 0 preview 1 https dev a
  • 如何设置表单下拉列表的样式?

    我在互联网上进行了广泛的搜索 但没有找到任何关于如何在表单中设置下拉列表的下拉部分样式的有用信息 我希望能指出正确的方向 谢谢 我已经研究同样的问题有一段时间了 想出了一个非常简单的解决方案 使用比下拉列表本身更短的保持器 div 我还使用
  • 如何判断 /bin/sh 中的文件是否早于 30 分钟?

    如何编写脚本来确定 bin sh 中的文件是否早于 30 分钟 不幸的是没有stat系统中存在命令 这是一个古老的Unix系统 http en wikipedia org wiki Interactive Unix http en wiki
  • 如何填充 C++ 字符串中的一个部分?

    有一个空格字符串 string str new string str gt resize width 我想 在某个位置填充长度字符 在C中它看起来像 memset str pos length 我如何用 C 字符串实现这一点 我尝试过 st
  • MySQL 按月和年过滤结果

    我的表格显示了各个国家 地区的搜索量以及搜索日期 我想要一个查询来显示 2012 年和 2013 年每个月的搜索量 我需要为月份添加单独的列 年份和搜索次数 我之前使用过下面的查询 该查询返回每周的搜索量 但我想将其更改为仅 2012 年和
  • 如何在maven 2中指定一串目标作为defaultGoal?

    我只是好奇 有没有办法指定您希望将一串目标作为 Maven 项目中的默认目标运行 有没有类似蚂蚁的
  • C# .net cf 中的 nmea 校验和

    我正在尝试编写自己的 nmea 解析器 因为我只需要来自 GPS 的一些信息 并且不需要解释所有消息 我遇到的问题是我的 nmea 消息验证器给了我一个错误的校验和 有人能看到我做错了什么吗 我正在使用这个想法Codepedia 计算和验证