pelco-d协议数据解析示例

2014-08-14 21:57 286人阅读 评论(0) 收藏 举报
本文章已收录于:
分类:
程序编程(12)

作者同类文章X

代码工人的仓库(36)

作者同类文章X

代码生活(42)

作者同类文章X

版权声明:本文为迟思堂主人李迟原创文章,如转载请注明,并附带原文超链接地址,谢谢。



前段时间写了有关pelco协议的一些笔记,后来,有个小模块是接收pelco格式的数据,然后解析出是什么命令,于是又写了个简单的解析函数。这个函数没什么技术含量。主要思路:

1、逐字节解析,保证每一字节都处理到;
2、找到0xff,此为命令头;
3、找到命令结束字符,方法是根据pelco命令组装的算法,——其实就是当某一字节的值是前面几个的校验和就结束,有一点要校验和正确但长度不符合pelco标准的情况,比如出现0x01,0x02,0x03,根据校验方法是正确的,但它不是正确的命令,pelco文档有提到命令都是7个字节的,但有的文档的命令多于7字节,于是,统一用7字节或以上为判断。
4、结束,找到了一个命令。

代码如下:

[cpp] view plaincopy print?
  1. static void protocol_d(unsigned char* buffer, int len)
  2. {
  3. unsigned char* tmp = NULL;
  4. int cksm = 0;
  5. unsigned char ch = 0;
  6. int tmp_len = len;
  7. int cmd_len = 0;
  8. unsigned char* cmd_ptr = NULL;
  9. tmp = buffer;
  10. while (tmp_len > 0)
  11. {
  12. while (*tmp != 0xff)
  13. {
  14. tmp++;
  15. tmp_len--;
  16. if (tmp_len <= 0)
  17. goto end;
  18. }
  19. cmd_ptr = tmp;
  20. // 第一个字节
  21. ch = *(++tmp);
  22. cksm += ch;
  23. cmd_len = 2;
  24. tmp_len--;
  25. while (tmp_len > 0)
  26. {
  27. ch = *(++tmp);
  28. cmd_len++;
  29. tmp_len--;
  30. if (ch == cksm && cmd_len >= 7)
  31. {
  32. dump_cmd(NULL, cmd_ptr, cmd_len);
  33. //找到了命令,就可以做其它事情了。
  34. cksm = 0;
  35. break;
  36. }
  37. cksm += ch;
  38. cksm %= 0x100;
  39. }
  40. end:
  41. ;
  42. }
  43. }

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:;}
}

测试代码如下,特意加了些干扰的字符。

[cpp] view plaincopy print?
  1. int serial_simple_test()
  2. {
  3. #define LEN (5*7+2+2+2+3)
  4. unsigned char buffer[LEN] = {
  5. 0x11, 0x8, 0xff, 0x01, 0x00, 0x08, 0x00, 0x01, 0x0a,
  6. 0xff, 0x01, 0x00, 0x08, 0x00, 0x02, 0x0b, 0x9,
  7. 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01,
  8. 0xff, 0x01, 0x00, 0x0c, 0x0d, 0x08, 0x22,0x9,
  9. 0xff, 0x01, 0x00, 0x01, 0x01, 0x03, 0x6, 0x01, 0x05,
  10. };
  11. protocol_d(buffer, LEN);
  12. return 0;
  13. }

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构建的一个错误的解决

我的同类文章

程序编程(12) 代码工人的仓库(36) 代码生活(42)
http://blog.csdn.net

  • 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协议数据解析示例相关推荐

  1. 微信蓝牙协议一:协议文档查阅方法和空中数据解析示例

    目录 一.概述 二.抓取数据 三.包头解析 四.包体解析 4.1 第一部分 4.2 第二部分 4.3 第三部分 一.概述 本文主要是记录下微信蓝牙数据的分析过程.需要使用两份文档: <微信蓝牙外 ...

  2. 一个通用网络协议数据解析

    1.网络数据解析 我们在实际应用中,网络数据解析是非常常见的一种数据处理方式,那么有没有比较通用的数据解析处理方法呢,以下是个人总结的一种网络数据解析处理方法 2.数据包格式 图1-1是一个比较通用的 ...

  3. C# 串口操作系列(3) -- 协议篇,二进制协议数据解析

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/05/27/5627253.aspx 我们的串口程序,除了通用的,进行串口监听 ...

  4. C# 串口操作系列(4) -- 协议篇,文本协议数据解析 .

    上一篇已经介绍了协议的组成,一个协议,一般具有 :协议头+长度+数据+校验 , 文本格式可以直观的定义回车换行是协议的结尾,所以我们可以省略数据长度,增加协议尾.即: 协议头 + 数据 + 校验 + ...

  5. C# 串口操作系列(4) -- 协议篇,文本协议数据解析

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyazhe/archive/2010/06/09/5657188.aspx 上一篇已经介绍了协议的组成,一个协议,一 ...

  6. 协议数据的发送与解析

    协议数据的发送与解析 对于C,C++等语言而言,我们常见各种各样的基本数据类型,比如char,int,float,double等等.为了回顾一一下具体的数据类型,下面我们看下面的一张表来回顾一下. 类 ...

  7. 音视频方案,音视频扩展内容- 音视频数据解析,码流分析及质量评价(笔记)3

    -- 音视频编解码流程如下图: -- 关于音频各种参数: freq:音频数据的采样率.常用的有48000,44100等. format:音频数据的格式.举例几种格式: AUDIO_U16SYS:Uns ...

  8. 标准 sscanf 解析语法与数据解析

    概述 在C语言应用开发过程中,常常需要对字符串数据进行解析,这些字符串可能是从文件.键盘或者其他设备读入.比如与 AT 设备通信时,需要对 AT 设备发送过来的数据进行解析,从而获得我们想要的一些数据 ...

  9. php post 获取xml,php 获取post的xml数据并解析示例

    这篇文章主要为大家详细介绍了php 获取post的xml数据并解析示例,具有一定的参考价值,可以用来参考一下. 对php获取post过来的xml数据并解析感兴趣的小伙伴,下面一起跟随512笔记的小编两 ...

最新文章

  1. 如何快速部署国人开源的 Java 博客系统 Tale
  2. 关于极光IM设置昵称不生效的解决办法
  3. Linux 上与系统负载有关的命令
  4. Android.mk文件的解析
  5. ECharts - 气泡图
  6. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型
  7. 1024程序员节:给DBA们的福音
  8. sql 保留整数_Spark 3.0发布啦,改进SQL,弃Python 2,更好的兼容ANSI SQL,性能大幅提升...
  9. nginx工作原理及配置
  10. 大华设备无法注册EasyGBS国标视频平台,是什么原因?
  11. 拼多多商家使用拼多多上传图片尺寸软件教程
  12. 苹果与宝马和奔驰关于自动驾驶汽车的谈判告吹,退而求其次选择与大众汽车合作
  13. html在excel中查询,excel通配符查找 excel任意字母的通配符
  14. 最新FFmpeg RTSP流抓取
  15. 深信服 2019校园招聘 研发试卷-2018.09.21
  16. FITC修饰药物;CY3荧光标记氟维司群/依西美坦/齐多夫定/丁二酸(琥珀酸)/醋酸卡泊芬净的定制合成
  17. 免费Linux CAD应用软件
  18. php教程 微信,php微信开发接入
  19. oracle 下bdump占用大,【学习笔记】Oracle oradebug 利用oradebug释放被删除文件空间的案例...
  20. 如何解决c++文件读写流无法读取中文的问题(vc6.0)

热门文章

  1. 实现CheckboxGroup的全部选中
  2. 此心拖泥带水,是人生最苦处
  3. 如何Docker化任意一个应用
  4. 英特尔推出增强商用电脑安全的新技术
  5. Elasticsearch2.x Cluster Health
  6. 根据坐标获取地图经纬度
  7. 高性能WEB开发(6) - web性能测试工具推荐
  8. Delphi数据类型及转换(附:源码)
  9. 【数据安全案例】个人信息倒卖产业链悄然形成,司法困境依旧待解
  10. 【主机】vnc 介绍以及安装时注意的问题