上一章介绍了简短的几行C#代码,从串口读取北斗数据的方法。

这一章需要介绍一下北斗数据接口的基本协议,也就是类似下面的命令的含义。

$CCICA,0,0*4B\r\n

网上有很多比较早的代码是基于北斗4.0的协议,那个协议是一种二进制协议,编程人员需要认真准备数据中的每一个bit,如果出错,调试会极为困难。

所以后来出现了2.1协议,这个协议是文本协议,北斗终端中的芯片负责把它们转换成二进制,实际内部传输的仍是二进制,但编程起来更加容易,所以新的北斗终端都会支持2.1协议。

关于这个2.1协议,北斗官网上曾经公开过一份文档《北斗卫星导航系统用户终端通用数据接口(预)》,发布日期为2014年8月,后来这个资料被撤下了,但还能从其它地方找到,只是文档中有许多错误。

北斗指令

北斗指令以$开始(据说也可以是叹号!,但我现在还没遇到),然后是5个字符的指令代码,后面有多个参数,用逗号分隔,*表示指令结束,hh是校验码,最后是回车换行符,十六进制为0x0D和0x0A。

$CCICA,0,0*4B\r\n

指令代码为5个字符,前2个字符为发送器(信源)的标识符,后3个字符为语句标识符。

前2个字符的定义见下表:

标识符 发送器(信源)数据类型
BD 北斗导航定位系统(BDS)
GP 全球定位系统(GPS-global positioning system)
GN 全球导航卫星系统(GNSS-global navigation satellite system)
GL GLONASS系统
GA 伽利略系统
CC 计算机系统

后面3个字符的定义可参考《北斗卫星导航用户终端通用数据接口2.1协议》,不同的北斗厂商又增加了不同的自定义语句。

例如:CCICA、BDICI、BDGGA、GPGGA、GNGGA、GPGSA、CCRMO、CCTXA、BDFKI都是常用的指令。

校验码生成规则

hh校验码是$ 和*之间(不含$和*)所有字符的异或,然后用两个16进制大写字符表示,C#代码如下。

byte sum = 0;
foreach (char c in bdstr)
{if (c == '$' || c == '!') continue;if (c == '*') break;sum ^= (byte)c;
}
return sum.ToString("X2");

下面以$CCICA指令为例,说明校验码的生成过程。


根据这个规则,你可以自行验证一下,下面这行命令的校验码。

$BDICI,0925867,2204536,1934946,6,60,3,N,0*0F

实现一个小功能,发一行北斗命令,查看反馈信息

现在我们可以实现一个小功能,给串口写入一段北斗命令,立刻从串口读取一行信息,可以开展北斗命令的测试工作。

/// <summary>
/// 这个函数不是非常严谨,由于串口通讯是异步的,
/// 你给串口写入一行命令,然后立即读串口,存在一定的概率,紧接的反馈文本行并不是你期望的结果,
/// 比如,你发送了$CCICA,可能并不能立即收到$BDICI反馈。
/// </summary>
/// <param name="port">串口</param>
/// <param name="cmd">北斗命令,程序自动补上校验码</param>
/// <returns>串口的一行反馈信息</returns>
static string SendCmd(SerialPort port, string cmd)
{cmd = cmd.Trim();cmd = cmd + "*" + CheckSum(cmd) + "\r\n";Console.Write("写串口:" + cmd);port.Write(cmd);return port.ReadLine();
}/// <summary>
/// 计算校验码, $和*(或行尾)之间(不含$和*)的所有字符的异或。
/// </summary>
/// <param name="bdstr">北斗指令</param>
/// <returns>两个16进制数字,大写</returns>
static string CheckSum(string bdstr)
{byte sum = 0;foreach (char c in bdstr){if (c == '$' || c == '!') continue;if (c == '*') break;sum ^= (byte)c;}return sum.ToString("X2");
}

现在主程序比较简单了,我们可以试验两条北斗命令的输出结果。SBX的反馈信息包括设备的厂商、类型、协议版本、序列号和卡号等信息。有关SBX的说明可以参看北斗2.1协议。

string result = SendCmd(port, "$CCICA,0,0");
Console.WriteLine(result);
result = SendCmd(port, "$CCRMO,SBX,2,0");
Console.WriteLine(result);

小结

1)4.0协议不好调试,常用2.1文本协议
2)$开头
3)命令有5个字符,前2个是信源,后3个是命令的含义
4)*hh是校验码,异或生成,两个16进制数
5)回车换行\r\n放末尾

用C#进行北斗串口编程之二:北斗2.1协议基础相关推荐

  1. UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机

    UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...

  2. Python网络编程之二:网络编程基础

    Python网络编程之二:网络编程基础 一.基础概念 1.两个地址 1.1.mac地址 mac地址:直译为媒体存取控制位址,也称为局域网地址.MAC位址.以太网地址或物理地址,它是一个用来确认网络设备 ...

  3. linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机

    一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...

  4. socket编程之二:两种链接类型tcp和udp

    前面一篇文章说到了一些计算机网络的基础知识.引入了socket.从这节開始,就进入正题了. 一 概述 TCP:Transimission Control Protocol传输控制协议. UPD:Use ...

  5. IOS高级编程之二:IOS的数据存储与IO

    一.应用程序沙盒 IOS应用程序职能在系统为该应用所分配的文件区域下读写文件,这个文件区域就是应用程序沙盒.所有的非代码文件如:图片.声音.映象等等都存放在此. 在mac中command+shift+ ...

  6. 深入浅出Visual C++串口编程--深入浅出VC++串口编程之DOS的串口编程

    在DOS平台下,操作串口主要有下列方式:通过BIOS调用.通过串口的硬件中断或通过对串口硬件进行轮询,本章将对以上三种方式进行具体的介绍并给出例子. 1.BIOS中断 在DOS操作系统下,IBM PC ...

  7. 响应式编程之二:RxJava概述:在Android平台上开发详解

    RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 ...

  8. ORACLE PL/SQL编程之二:PL/SQL块结构和组成元素

    2.1 PL/SQL块 PL/SQL程序由三个块组成,即声明部分.执行部分.异常处理部分. PL/SQL块的结构如下: DECLARE --声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及 ...

  9. Linux C编程之二:Linux基础

    1.Linux的特点 (1)Linux就是一个操作系统(作为用户和计算机之间接口的软件程序) 注:操作系统的功能:命令解释,进程管理,内存管理,输入输出(I/O)操作和外围设备管理,文件管理 (2)特 ...

最新文章

  1. python 登陆开心网图片批量下载-selenium实现
  2. HZOJ 赤(CF739E Gosha is hunting)
  3. 轻松掌控全链路监控:方案概述与对比 | 真的很干!
  4. hdu 1542/1255 Atlantis/覆盖的面积
  5. animate.css官网
  6. 动手动脑第二波方法的重载
  7. 对警报线程池的警报线程_使用警报控制器的iOS操作表
  8. 纽微特纪事:改个字串,竟然成了“二期工作”,还拖了几个月
  9. 鸡啄米VS2010/MFC编程入门教程——学习3(安装VS2010)
  10. Centos操作系统
  11. 怎么查微信公众号服务器,微信公众号查询数据库,微信公众号数据库怎么查询?...
  12. [转]Oracle数据库逻辑增量备份之exp/imp
  13. COGS 1299. bplusa【听说比a+b还要水的大水题???】
  14. 前端三件套系例之JS——JavaScript内置方法
  15. 国家计算机考试培训心得,最新计算机培训心得总结5篇
  16. 【delphi】TMS_Component_Pack_v9.2.4.0中的TadvMemo 支持中文完美修改
  17. [日常训练] 联络网
  18. 字体转换网站——Font Squirrel(推荐阅读)
  19. 计算机病毒的关键技术,计算机病毒实验系统关键技术研究与实现
  20. 家乐福618保卫战二-零售O2O场景中的万级并发交易情况下的极限性能调优

热门文章

  1. matlab科学计算 书,MATLAB与科学计算(第3版)
  2. C++生成的exe在windows系统打开显示缺少dll动态库
  3. Anaconda手动安装第三方库/离线库
  4. Flash 第十章 补间动画复习和引导动画
  5. 4s店维修保养记录服务器,4s店维修保养记录怎么查?免费查询汽车维修保养记录方法...
  6. 2013年专利代理人考试复习规划
  7. preprocess
  8. 钠斯语音聊天系统-多人语聊房一键上麦,技能、婚姻、家族多种互动方式
  9. NextErp 数据导入 文档字段自动填充上下文代码分析
  10. Java借助API输出百分数