PELCO-D

2023-05-16

https://blog.csdn.net/subfate/article/details/36644419

在搞visca的同时顺便也搞了pelco。这里再做个笔记。

pelco,中文翻译为“派尔高”,在行文和写代码过程,写pelco比写“派尔高”快很多,所以一般就写pelco。这个协议在云台控制中用得比较多,比较出名的有PTZ,用rs232或rs485来通信。pelco有两种协议,D协议和P协议,两者命令封装不太一样,网上有协议的说明文档,也有实现的代码,我找到一个C#写的,某搜索引擎上找得到的介绍派尔高协议的,基本上都是直接把每个命令的数据一一写成数组来调用,个人认为这样不太方便。

本文所讲的是pelco D协议。

一、命令格式

文档中说pelco D协议的命令都是7个字节的(实际上,有些不是),命令格式如下图:


说明:

字节1:D协议同步头为0xFF。
字节2:相机编号(或称地址),范围为1~0xFF,0x01表示相机1。
字节3:CMND1,命令1。
字节4:CMND2,命令2。作为扩展命令,命令数值为奇数。
字节5:数据字节1,作为motion命令,其表示pan的速度。
字节6:数据字节2,作为motion命令,其表示tilt的速度。
字节7:检验码,计算公式:(字节2+字节3+字节4+字节5+字节6)% 0x100。注:检验码是除了同步头及本身(CKSM)字节外的所有字节的的和,再除以265,取余数(用“%”即可)。

命令共2大类,motion命令,和非motion命令(注:可以称为基本命令和扩展命令/高级命令)。其中motion命令,在CMND2中Bit0始终为0。反之,该比特为1表示非motion命令。
motion命令包含了水平移动、垂直移动、光圈、变焦、对焦等功能。这类命令是由命令1和命令2的各个位来表示的。如下图:

要实现某一项功能,只要在对应的位置设为1即可,有些命令是可以同时设置的,但有些是不行的,比如,可以同时实现左(右)转和向上(下)转动,但不能同时左转及右转(两者是互斥的)。

Bit7含义为“sense bit”(sense一词,在linux内核中使用比较多,我其实也搞不明白这个词中文该怎么表达),它决定了Bit4和Bit3的含义。如下图所示:

其实说白了,就是这3个比特的哪些组合可以控制相机上断电,自动扫描,哪些无效,等等。说到这里,想起来了公司某部门发的一个邮件,说某客户想接入云台,是用派尔高协议来控制的,然后还顺带一个中文的协议文档,这个文档翻译得不伦不类,应该是机器翻译的,把“sense bit”翻译成“感觉字节”,一开始看中文文档时,完全一头雾水,后面经过努力,上网上查了英文原版,才有点理解。所以,有时候,看英文原版获取的资源更通俗,更准确。

二、响应

相机返回的响应包有4种,0字节、4字节、7字节、18字节。除了第一种外,其它每种都和上面给出的命令格式相似,同步头+相机地址+信息体+检验码。文档中有每种响应包的具体格式的描述,如果格式来解析即可得到想要的数据。文档中说大部分命令是有返回值的——像上面的motion命令,也有响应包,但我实际测试的结果,串口是没有返回什么数据的,或者是我拿到的那个东西本身就是这样的。

三、协议文档备注

协议文档中每条命令都讲得比较细,不过,有部分命令是厂家自己实现的,比如,有些命令超过7个字节,这跟协议上讲的有冲突,但实际上却是可以的。这个主要是看厂家提供的协议文档了。说到这,不得不提现在我接手的这个任务,厂家提供的文档惜墨如金,不肯多写一点字,文档又不规范,东写一点,西写一点,给的文档也不全,有些命令还要问人家才知道。

四、实现

为了方便,专门为pelco通信定义了PELCOPacket_t结构体(其实它和上一篇文章的visca那个结构体是同一个东西),命令封装如下:

    void _pelco_append_byte(PELCOPacket_t *packet, unsigned char byte)
    {
        packet->bytes[packet->length]=byte;
        (packet->length)++;
    }
     
    void _pelco_init_packet(PELCOPacket_t *packet)
    {
        // set it to null
        memset(packet->bytes, '\0', sizeof(packet->bytes));
        // we start writing at byte 2, the first byte and the second will be filled by the
        // packet sending function(_pelco_send_packet). This function will also append a cksm.
        packet->length = 2;
    }

注意,初始化时,命令包的长度是2,因为pelco协议的真正数据是从第2个字节开始的,这让调用者关注的是真正的数据,而不用理会同步头、相机地址等信息。命令发送如下:

    // All commands are 7 bytes long in D Protocol
    int _pelco_send_packet(PELCOInterface_t *iface, PELCOPacket_t *packet)
    {
        int cksm = 0;
        int i = 0;
     
        // check data:
        if (iface->address>0xff)
        {
            return PELCO_FAILURE;
        }
     
        // build header:
        packet->bytes[0] = 0xff;
        packet->bytes[1] = iface->address;
     
        // see spec, some cmd has 7 bytes, some has 9 bytes
        for (i = 0; i < packet->length; i++)
        {
            cksm += packet->bytes[1+i];
        }
        cksm  = cksm % 0x100;
     
        /*
        cksm = (packet->bytes[1] + packet->bytes[2] + packet->bytes[3] +
                packet->bytes[4] + packet->bytes[5]) % 0x100;
        */
        // append footer(cksm)
        _pelco_append_byte(packet,cksm);
     
        return _pelco_write_packet_data(iface,packet);
        
        
    }

因为有些命令不只有7个字节,所以这里用for循环计算每个需要计算的字节,而不是指定哪一些字节被计算。

命令的封装接口比较简单,基本上和visca一样,比如,像stop命令,就是所有的信息体都搞成0就行了。

    int pelco_camera_stop(PELCOInterface_t *iface)
    {
        PELCOPacket_t packet;
     
        _pelco_init_packet(&packet);
        _pelco_append_byte(&packet,0x00);
        _pelco_append_byte(&packet,0x00);
        _pelco_append_byte(&packet,0x00);
        _pelco_append_byte(&packet,0x00);
     
        return _pelco_send_packet_no_reply(iface, &packet);
    }


参考资源:

1、一个C#实现的工程:http://www.codeproject.com/Articles/8034/Pelco-P-and-D-protocol-implementation-in-C

2、一个图文并茂的示例:http://www.commfront.com/RS232_Examples/CCTV/Pelco_D_Pelco_P_Examples_Tutorial.HTM

后记:本文出现很多次“搞”,近来的确是东搞西搞,人在公司,身不由己。本文仅对协议进行描述,不贴出实际的实现代码。
https://blog.csdn.net/subfate/article/details/36644419

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

PELCO-D 的相关文章

  • Maven+Jetty运行项目无法热修改html处理

    一直以来都在做后端工程的开发 xff0c 很少做前端设计 xff0c 最近工作需要开始做前端开发 xff0c 感觉 辛辛苦苦几十年 xff0c 一朝回到解放前 的节奏啊 xff0c 遇到不少问题 xff0c 记录下来以备后查 今天在使用Ma
  • Spring4.3.0 Junit4.11 initializationError(org.junit.runner.manipulation.Filter)

    Spring4 3 0 Junit4 11 initializationError org junit runner manipulation Filter 昨天手欠 xff0c 在项目中把Spring3 2 14版本升级到4 3 0版本
  • zookeeper入门(一)——ZooKeeper伪集群安装

    zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装 在进行本篇文章之前 xff0c 先请大家了解一下zookeeper xff08 后面的文章为了省事有可能直接使用zk缩写来替代 xff09 xff0c 关于z
  • zookeeper入门(二)——zk客户端脚本使用

    zookeeper入门 xff08 二 xff09 zk客户端脚本使用 在上一篇文章zookeeper入门 xff08 一 xff09 ZooKeeper伪集群安装我们讲了在单机进行zk伪集群安装 xff0c 本篇文章我们来讲一下zk提供的
  • 事务基础知识

    数据库事务 数据库事务定义 xff0c 满足4个特性 xff1a 原子性 xff08 Atomic xff09 一致性 xff08 Consistency xff09 隔离性 xff08 Isolation xff09 和持久性 xff08
  • MySQL事务隔离级别

    1 MySQL所支持的事务隔离级别 MySQL所支持的事务隔离级别 xff1a READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE 其中 REPEATABLE READ是
  • Thrift第一个示例

    第一步 xff1a 引入thrift依赖包 compile span class hljs keyword group span span class hljs string 39 org apache thrift 39 span nam
  • FreeRTOS系列|计数信号量

    计数信号量 1 计数信号量简介 计数型信号量有以下两种典型用法 事件计数 xff1a 每次事件发生 xff0c 事件处理函数将释放信号量 xff08 信号量计数值加1 xff09 xff0c 其他处理任务会获取信号量 xff08 信号量计数
  • Redis学习——01.redis安装

    下载 tar xzvf redis span class hljs number 3 2 span span class hljs number 10 span span class hljs preprocessor tar span s
  • IDEA常用设置

    显示主题 建议使用Darcula Appearance gt Theme 编辑器字体 建议使用Courier New或者Consolas Editor gt Font gt Font 打开自动编译 Compiler gt Build pro
  • Windows下执行Linux命令

    常用的工具 Cygwin xff08 http www cygwin com xff09 Cygwin是一个在windows平台上运行的类UNIX模拟环境 xff0c 详细参见百度百科 xff1a https baike baidu com

随机推荐

  • Linux网络编程 - 多线程服务器端的实现(1)

    引言 本来 xff0c 线程在 Windows 中的应用比在 Linux 平台中的应用更广泛 但 Web 服务的发展迫使 UNIX 系列的操作系统开始重视线程 由于 Web 服务器端协议本身具有的特点 xff0c 经常需要同时向多个客户端提
  • 访问带有用户名、密码保护的 URL

    一 URL xff0c 统一资源定位器 指向互联网上的 资源 xff0c 可协议名 主机 端口和资源组成 如 http username password 64 host 8080 directory file query ref Comp
  • 【RT-Thread】STM32F1片内Flash实现Bootloader

    目录 前言1 开发环境搭建2 Bootloader制作3 APP程序制作4 OTA固件打包5 Ymodem升级小结 前言 RT Thread官网对于Bootloader的实现方案有非常详细的描述 xff0c 目前支持F1 F4 L4系列单片
  • SDVOE和传统矩阵的区别

    SDVOE最显著的特点 xff1a 分辨率高 xff0c 最高支持4KP60 4 4 4 图像质量好 xff0c 完全可以达到无压缩效果延时小 xff0c Genlock模式下4K30延时只有不到0 1ms xff0c 链路上嵌入千兆网络
  • GD32的DMA配置

    参考 GD32F4xx 用户手册 DMA 控制器由 4 部分组成 xff1a AHB 从接口配置 DMA xff1b 两个 AHB 主接口进行数据传输 xff1b 两个仲裁器进行 DMA 请求的优先级管理 xff1b 数据处理和计数 DMA
  • nuttx杂记

    1 设置自启动应用 修改deconfig文件下的 CONFIG INIT ENTRYPOINT 参数即可 2 消息队列使用 以下是Nuttx系统中使用queue create函数创建队列的示例代码 xff1a include lt stdi
  • linux下使用jlink 调试 stm32的破事

    安装libusb sudo apt get install libusb 安装readline wget c ftp ftp gnu org gnu readline readline 6 2 tar gz tar zxvf readlin
  • FreeRTOS系列|软件定时器

    软件定时器 MCU一般都自带定时器 xff0c 属于硬件定时器 xff0c 但是不同的MCU其硬件定时器数量不同 xff0c 有时需要考虑成本的问题 在硬件定时器不够用的时候 xff0c FreeRTOS也提供了定时器功能 xff0c 不过
  • 视频芯片选择

    常用的视频芯片记录 HDMI TI ITE Explore Silicon image ADI semtech https www semtech com Realtek MACRO http www mitinc co kr module
  • 眼图里的那些破事

    1 眼图基本概念 1 1 眼图的形成原理 眼图是一系列数字信号在示波器上累积而显示的图形 xff0c 它包含了丰富的信息 xff0c 从眼图上可以观察出码间串扰和噪声的影响 xff0c 体现了数字信号整体的特征 xff0c 从而估计系统优劣
  • IIC的地址

    7位寻址 在7位寻址过程中 xff0c 从机地址在启动信号后的第一个字节开始传输 xff0c 该字节的前7位为从机地址 xff0c 第8位为读写位 xff0c 其中0表示写 xff0c 1表示读 图1 xff1a 7位寻址 I2C总线规范规
  • ODR, BSRR, BRR的差别

    ODR寄存器可读可写 xff1a 既能控制管脚为高电平 xff0c 也能控制管脚为低电平 管脚对于位写1 gpio 管脚为高电平 xff0c 写 0 为低电平 BSRR 只写寄存器 xff1a color 61 Red 既能控制管脚为高电平
  • ACAP究竟是什么

    Xilinx推出Versal系列 xff0c 号称业界首款ACAP xff0c 自适应计算加速平台 ACAP不仅是一个新的处理器 xff0c 而且是新的产品类型 作为率先推出ACAP这样类型产品的公司 xff0c 这也是赛灵思的核心竞争力所
  • ISE 14.7 调试错误笔记

    1 ERROR Pack 2530 The dual data rate register 34 U sys ctl ODDR2 inst 2 34 failed to join an OLOGIC component as require
  • HDMI 4K分辨率 时序

    参考 HDMI1 4标准 High Definition Multimedia Interface Specification 这份文件放在百度网盘共享了 xff0c 上传到文档平台会被封禁 xff0c 如果侵权 xff0c 麻烦联系我删除
  • 深度学习CPU,GPU,NPU,TPU以及其计算能力单位

    处理器运算能力单位 TOPS是Tera Operations Per Second的缩写 xff0c 1TOPS代表处理器每秒钟可进行一万亿次 xff08 10 12 xff09 操作 与此对应的还有GOPS xff08 Giga Oper
  • SSD数据集增强方法

    coding utf 8 import numpy as np import random import cv2 import glob import os import xml etree cElementTree as ET def r
  • 目标检测图像增强

    https blog csdn net wei guo xd article details 74199729 常用的图像扩充方式有 xff1a 水平翻转 xff0c 裁剪 xff0c 视角变换 xff0c jpeg压缩 xff0c 尺度变
  • FreeRTOS系列|低功耗管理

    低功耗管理 很多应用场合对于空耗的要求很严格 xff0c 比如可穿戴低功耗产品 物联网低功耗产品等 一般MCU都有相应的低功耗模式 xff0c 裸机开发时可以使用MCU的低功耗模式 FreeRTOS也提供了一个叫Tickless的低功耗模式
  • PELCO-D

    https blog csdn net subfate article details 36644419 在搞visca的同时顺便也搞了pelco 这里再做个笔记 pelco xff0c 中文翻译为 派尔高 xff0c 在行文和写代码过程