C#Pelco-D云台协议
此外,在执行某一命令后,应执行停止命令,否则命令执行的动作会一直执行。例如,将摄像头向上移动。如果不发送停止 命令,摄像头就会一直向上移动。在 Pelco-D2400 协议的停止命令中,第一个字节为 FFH,第 2 个字节为地址码,第 3、 4、5、6 个字节为 00F,第 7 个字节为第 2 个字节数据与 100H 的模。
throw new Exception("Pelco D 协议只支持设备"); Address = Byte.Parse((address).ToString()); Data1 = data1; Data2 = data2; Command1 = command1; Command2 = command2; CheckSum = (byte)( STX ^ Address ^ Command1 ^ Command2 ^ Data1 ^ Data2); return new byte[] { STX, Address, Command1, Command2, Data1, Data2, CheckSum }; } } public partial class frmMain : Form { PelcoD pelcod = new PelcoD(); SerialPort serialPort = new SerialPort("COM1", 2400, Parity.None, 8); byte addressin = Byte.Parse(Convert.ToString(0x01)); byte speedin = Byte.Parse(Convert.ToString(0xff)); byte[] messagesend; //方向控制——下 private void btnDown_MouseDown(object sender, MouseEventArgs e) { messagesend = pelcod.CameraTilt(addressin, PelcoD.Tilt.Down, speedin); serialPort.Open(); serialPort.Write(messagesend, 0, 7); serialPort.Close(); } }
Leabharlann Baidu
1.9.3 云台控制协议
云台是通过云台解码器与计算机串口或并口相连的,程序是通过向云台解码器发送指令来实现云台控制的。这里的指令是由 云台控制协议确定的。不同的厂家,云台控制协议也不尽相同。以 Pelco-D2400 为例,其命令格式由 7 个字节构成。第一 个字节为同步字节,始终为 FFH,第 2 个字节为地址码,也就是摄像头的逻辑地址号,范围在 00H~FFH 之间,是在安装摄 像头时手动设置的,该值一定要正确,否则命令不会执行。第 3、4 个字节表示指令码,即执行哪项操作,例如,向上、下、 左、右移动摄像头等。第 5、6 个字节表示数据码,用于指定摄像头的水平、垂直方向移动速度。第 7 个字节为校验码,它 是由第 2、3、4、5、6 个字节数据之和与 100H 取模获得的。
只要知道了控制命令,就可以通过向串口发送这些命令来控制云台了。例如,下面的代码实现了云台的向下移动。
class PelcoD { private static readonly byte STX = 0xFF; //同步字节 private const byte TiltUp = 0x08; //上 private const byte TiltDown = 0x10; //下 #region 镜头上下移动的速度 private const byte TiltSpeedMin = 0x00; //停止 private const byte TiltSpeedMax = 0x3F; //最高速 #endregion public enum Tilt { Up = TiltUp, Down = TiltDown } //上下控制 //上下控制 public byte[] CameraTilt(uint deviceAddress, Tilt action, uint speed) { if (speed < TiltSpeedMin) speed = TiltSpeedMin; if (speed < TiltSpeedMax) speed = TiltSpeedMax; return Message.GetMessage(deviceAddress, 0x00, (byte)action, 0x00, (byte)speed); } public struct Message { public static byte Address; public static byte CheckSum; public static byte Command1, Command2, Data1, Data2; public static byte[] GetMessage(uint address, byte command1, byte command2, byte data1, byte data2) { if (address < 1 & address > 256)