pelco-d协议数据解析示例
pelco-d协议数据解析示例
代码工人的仓库(36)
代码生活(42)
版权声明:本文为迟思堂主人李迟原创文章,如转载请注明,并附带原文超链接地址,谢谢。
前段时间写了有关pelco协议的一些笔记,后来,有个小模块是接收pelco格式的数据,然后解析出是什么命令,于是又写了个简单的解析函数。这个函数没什么技术含量。主要思路:
1、逐字节解析,保证每一字节都处理到;
2、找到0xff,此为命令头;
3、找到命令结束字符,方法是根据pelco命令组装的算法,——其实就是当某一字节的值是前面几个的校验和就结束,有一点要校验和正确但长度不符合pelco标准的情况,比如出现0x01,0x02,0x03,根据校验方法是正确的,但它不是正确的命令,pelco文档有提到命令都是7个字节的,但有的文档的命令多于7字节,于是,统一用7字节或以上为判断。
4、结束,找到了一个命令。
代码如下:
- static void protocol_d(unsigned char* buffer, int len)
- {
- unsigned char* tmp = NULL;
- int cksm = 0;
- unsigned char ch = 0;
- int tmp_len = len;
- int cmd_len = 0;
- unsigned char* cmd_ptr = NULL;
- tmp = buffer;
- while (tmp_len > 0)
- {
- while (*tmp != 0xff)
- {
- tmp++;
- tmp_len--;
- if (tmp_len <= 0)
- goto end;
- }
- cmd_ptr = tmp;
- // 第一个字节
- ch = *(++tmp);
- cksm += ch;
- cmd_len = 2;
- tmp_len--;
- while (tmp_len > 0)
- {
- ch = *(++tmp);
- cmd_len++;
- tmp_len--;
- if (ch == cksm && cmd_len >= 7)
- {
- dump_cmd(NULL, cmd_ptr, cmd_len);
- //找到了命令,就可以做其它事情了。
- cksm = 0;
- break;
- }
- cksm += ch;
- cksm %= 0x100;
- }
- end:
- ;
- }
- }
static void protocol_d(unsigned char* buffer, int len)
{unsigned char* tmp = NULL;int cksm = 0;unsigned char ch = 0;int tmp_len = len;int cmd_len = 0;unsigned char* cmd_ptr = NULL;tmp = buffer;while (tmp_len > 0){while (*tmp != 0xff){tmp++;tmp_len--;if (tmp_len <= 0)goto end;}cmd_ptr = tmp; // 第一个字节ch = *(++tmp);cksm += ch;cmd_len = 2;tmp_len--;while (tmp_len > 0){ch = *(++tmp);cmd_len++;tmp_len--;if (ch == cksm && cmd_len >= 7){dump_cmd(NULL, cmd_ptr, cmd_len);//找到了命令,就可以做其它事情了。 cksm = 0;break;}cksm += ch;cksm %= 0x100;}end:;}
}
测试代码如下,特意加了些干扰的字符。
- int serial_simple_test()
- {
- #define LEN (5*7+2+2+2+3)
- unsigned char buffer[LEN] = {
- 0x11, 0x8, 0xff, 0x01, 0x00, 0x08, 0x00, 0x01, 0x0a,
- 0xff, 0x01, 0x00, 0x08, 0x00, 0x02, 0x0b, 0x9,
- 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0xff, 0x01, 0x00, 0x0c, 0x0d, 0x08, 0x22,0x9,
- 0xff, 0x01, 0x00, 0x01, 0x01, 0x03, 0x6, 0x01, 0x05,
- };
- protocol_d(buffer, LEN);
- return 0;
- }
int serial_simple_test()
{
#define LEN (5*7+2+2+2+3)unsigned char buffer[LEN] = {0x11, 0x8, 0xff, 0x01, 0x00, 0x08, 0x00, 0x01, 0x0a, 0xff, 0x01, 0x00, 0x08, 0x00, 0x02, 0x0b, 0x9,0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,0xff, 0x01, 0x00, 0x0c, 0x0d, 0x08, 0x22,0x9,0xff, 0x01, 0x00, 0x01, 0x01, 0x03, 0x6, 0x01, 0x05, };protocol_d(buffer, LEN);return 0;
}
李迟记于2014年8月14日
- 顶
- 0
- 踩
- 0
- 上一篇更新wordpress遇到prepare警告问题的解决
- 下一篇crosstool-ng构建的一个错误的解决
我的同类文章
- •GCC编译警告选项的学习2015-12-11阅读95
- •gcc较高版本的一些编译警告收集2015-05-06阅读436
- •遇到一个日志文件变化带来的文件句柄问题2015-01-25阅读199
- •遇到一个gcc编译器版本导致的运行结果有差异的问题2015-01-17阅读236
- •pelco协议及其实现的简单认识2014-07-03阅读342
- •一个可变参数类型检查的示例2015-05-06阅读140
- •参考ethtool写了个Linux设置、获取网卡模式的接口2015-03-30阅读294
- •再记一下sscanf的一个小问题2015-01-18阅读237
- •初识PCI2015-02-09阅读200
- •visca协议及其实现的简单认识2014-06-30阅读768
更多文章
pelco-d协议数据解析示例相关推荐
- 微信蓝牙协议一:协议文档查阅方法和空中数据解析示例
目录 一.概述 二.抓取数据 三.包头解析 四.包体解析 4.1 第一部分 4.2 第二部分 4.3 第三部分 一.概述 本文主要是记录下微信蓝牙数据的分析过程.需要使用两份文档: <微信蓝牙外 ...
- 一个通用网络协议数据解析
1.网络数据解析 我们在实际应用中,网络数据解析是非常常见的一种数据处理方式,那么有没有比较通用的数据解析处理方法呢,以下是个人总结的一种网络数据解析处理方法 2.数据包格式 图1-1是一个比较通用的 ...
- C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/05/27/5627253.aspx 我们的串口程序,除了通用的,进行串口监听 ...
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .
上一篇已经介绍了协议的组成,一个协议,一般具有 :协议头+长度+数据+校验 , 文本格式可以直观的定义回车换行是协议的结尾,所以我们可以省略数据长度,增加协议尾.即: 协议头 + 数据 + 校验 + ...
- C# 串口操作系列(4) -- 协议篇,文本协议数据解析
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/06/09/5657188.aspx 上一篇已经介绍了协议的组成,一个协议,一 ...
- 协议数据的发送与解析
协议数据的发送与解析 对于C,C++等语言而言,我们常见各种各样的基本数据类型,比如char,int,float,double等等.为了回顾一一下具体的数据类型,下面我们看下面的一张表来回顾一下. 类 ...
- 音视频方案,音视频扩展内容- 音视频数据解析,码流分析及质量评价(笔记)3
-- 音视频编解码流程如下图: -- 关于音频各种参数: freq:音频数据的采样率.常用的有48000,44100等. format:音频数据的格式.举例几种格式: AUDIO_U16SYS:Uns ...
- 标准 sscanf 解析语法与数据解析
概述 在C语言应用开发过程中,常常需要对字符串数据进行解析,这些字符串可能是从文件.键盘或者其他设备读入.比如与 AT 设备通信时,需要对 AT 设备发送过来的数据进行解析,从而获得我们想要的一些数据 ...
- php post 获取xml,php 获取post的xml数据并解析示例
这篇文章主要为大家详细介绍了php 获取post的xml数据并解析示例,具有一定的参考价值,可以用来参考一下. 对php获取post过来的xml数据并解析感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...
最新文章
- 如何快速部署国人开源的 Java 博客系统 Tale
- 关于极光IM设置昵称不生效的解决办法
- Linux 上与系统负载有关的命令
- Android.mk文件的解析
- ECharts - 气泡图
- java 数据类型分为_JAVA中分为基本数据类型及引用数据类型
- 1024程序员节:给DBA们的福音
- sql 保留整数_Spark 3.0发布啦,改进SQL,弃Python 2,更好的兼容ANSI SQL,性能大幅提升...
- nginx工作原理及配置
- 大华设备无法注册EasyGBS国标视频平台,是什么原因?
- 拼多多商家使用拼多多上传图片尺寸软件教程
- 苹果与宝马和奔驰关于自动驾驶汽车的谈判告吹,退而求其次选择与大众汽车合作
- html在excel中查询,excel通配符查找 excel任意字母的通配符
- 最新FFmpeg RTSP流抓取
- 深信服 2019校园招聘 研发试卷-2018.09.21
- FITC修饰药物;CY3荧光标记氟维司群/依西美坦/齐多夫定/丁二酸(琥珀酸)/醋酸卡泊芬净的定制合成
- 免费Linux CAD应用软件
- php教程 微信,php微信开发接入
- oracle 下bdump占用大,【学习笔记】Oracle oradebug 利用oradebug释放被删除文件空间的案例...
- 如何解决c++文件读写流无法读取中文的问题(vc6.0)