用C#进行北斗串口编程之二:北斗2.1协议基础
上一章介绍了简短的几行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协议基础相关推荐
- UART0串口编程(四):UART0串口编程之在UC/OS—II中遭遇的危机
UART0串口编程之在UC/OS-II中遭遇的危机 一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来 ...
- Python网络编程之二:网络编程基础
Python网络编程之二:网络编程基础 一.基础概念 1.两个地址 1.1.mac地址 mac地址:直译为媒体存取控制位址,也称为局域网地址.MAC位址.以太网地址或物理地址,它是一个用来确认网络设备 ...
- linux串口互斥,UART0串口编程之在UC/OS—II中遭遇的危机
一.潜在的危机 1.在uc/os操作系统中设计串口编程时,由于ISR和多个任务并发执行,情况比较复杂.尤其是接收状态为被动状态时,只能靠串行口中断来接收数据. 2.在进行串行通信时,双方遵循相同的通信 ...
- socket编程之二:两种链接类型tcp和udp
前面一篇文章说到了一些计算机网络的基础知识.引入了socket.从这节開始,就进入正题了. 一 概述 TCP:Transimission Control Protocol传输控制协议. UPD:Use ...
- IOS高级编程之二:IOS的数据存储与IO
一.应用程序沙盒 IOS应用程序职能在系统为该应用所分配的文件区域下读写文件,这个文件区域就是应用程序沙盒.所有的非代码文件如:图片.声音.映象等等都存放在此. 在mac中command+shift+ ...
- 深入浅出Visual C++串口编程--深入浅出VC++串口编程之DOS的串口编程
在DOS平台下,操作串口主要有下列方式:通过BIOS调用.通过串口的硬件中断或通过对串口硬件进行轮询,本章将对以上三种方式进行具体的介绍并给出例子. 1.BIOS中断 在DOS操作系统下,IBM PC ...
- 响应式编程之二:RxJava概述:在Android平台上开发详解
RxJava 到底是什么 RxJava 好在哪 API 介绍和原理简析 1. 概念:扩展的观察者模式 观察者模式 RxJava 的观察者模式 2. 基本实现 1) 创建 Observer 2) 创建 ...
- ORACLE PL/SQL编程之二:PL/SQL块结构和组成元素
2.1 PL/SQL块 PL/SQL程序由三个块组成,即声明部分.执行部分.异常处理部分. PL/SQL块的结构如下: DECLARE --声明部分: 在此声明PL/SQL用到的变量,类型及游标,以及 ...
- Linux C编程之二:Linux基础
1.Linux的特点 (1)Linux就是一个操作系统(作为用户和计算机之间接口的软件程序) 注:操作系统的功能:命令解释,进程管理,内存管理,输入输出(I/O)操作和外围设备管理,文件管理 (2)特 ...
最新文章
- python 登陆开心网图片批量下载-selenium实现
- HZOJ 赤(CF739E Gosha is hunting)
- 轻松掌控全链路监控:方案概述与对比 | 真的很干!
- hdu 1542/1255 Atlantis/覆盖的面积
- animate.css官网
- 动手动脑第二波方法的重载
- 对警报线程池的警报线程_使用警报控制器的iOS操作表
- 纽微特纪事:改个字串,竟然成了“二期工作”,还拖了几个月
- 鸡啄米VS2010/MFC编程入门教程——学习3(安装VS2010)
- Centos操作系统
- 怎么查微信公众号服务器,微信公众号查询数据库,微信公众号数据库怎么查询?...
- [转]Oracle数据库逻辑增量备份之exp/imp
- COGS 1299. bplusa【听说比a+b还要水的大水题???】
- 前端三件套系例之JS——JavaScript内置方法
- 国家计算机考试培训心得,最新计算机培训心得总结5篇
- 【delphi】TMS_Component_Pack_v9.2.4.0中的TadvMemo 支持中文完美修改
- [日常训练] 联络网
- 字体转换网站——Font Squirrel(推荐阅读)
- 计算机病毒的关键技术,计算机病毒实验系统关键技术研究与实现
- 家乐福618保卫战二-零售O2O场景中的万级并发交易情况下的极限性能调优
热门文章
- matlab科学计算 书,MATLAB与科学计算(第3版)
- C++生成的exe在windows系统打开显示缺少dll动态库
- Anaconda手动安装第三方库/离线库
- Flash 第十章 补间动画复习和引导动画
- 4s店维修保养记录服务器,4s店维修保养记录怎么查?免费查询汽车维修保养记录方法...
- 2013年专利代理人考试复习规划
- preprocess
- 钠斯语音聊天系统-多人语聊房一键上麦,技能、婚姻、家族多种互动方式
- NextErp 数据导入 文档字段自动填充上下文代码分析
- Java借助API输出百分数