Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1460494
  • 博文数量: 1125
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 16710
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-03 14:05
文章分类

全部博文(1125)

文章存档

2011年(1)

2008年(1124)

我的朋友

分类: 服务器与存储

2008-08-13 09:37:09

云台是通过云台解码器与计算机串口或并口相连的,程序是通过向云台解码器发送指令来实现云台控制的。这里的指令是由云台控制协议确定的。不同的厂家,云台控制协议也不尽相同。以Pelco-D2400为例,其命令格式由7个字节构成。第一个字节为同步字节,始终为FFH,第2个字节为地址码,也就是摄像头的逻辑地址号,范围在00H~FFH之间,是在安装摄像头时手动设置的,该值一定要正确,否则命令不会执行。第3、4个字节表示指令码,即执行哪项操作,例如,向上、下、左、右移动摄像头等。第5、6个字节表示数据码,用于指定摄像头的水平、垂直方向移动速度。第7个字节为校验码,它是由第2、3、4、5、6个字节数据之和与100H取模获得的。

此外,在执行某一命令后,应执行停止命令,否则命令执行的动作会一直执行。例如,将摄像头向上移动。如果不发送停止命令,摄像头就会一直向上移动。在Pelco-D2400协议的停止命令中,第一个字节为FFH,第2个字节为地址码,第3、4、5、6个字节为00F,第7个字节为第2个字节数据与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)
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();
}
}
阅读(1479) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~