系列文章目录
国惠光电相机SDK调用——相机命令协议格式和实现
前言
本节介绍国惠光电相机SDK控制命令,主要介绍协议格式,常用命令及C++示例代码实现。
一、命令协议格式
相机控制命令格式如下,共16字节
首部: 总是0xFF 0xFF 0xAA
地址: 范围是0x00~0xff (十进制是0 ~ 255),其中0xff为广播地址
数据长度: 总是0x00,代表数据由8字节组成
命令号: 范围为0x0001~0xffff,命令号的低字节在前,用于区分不同的命令
数据: 8字节可变数据,低字节在前。
校验和: 占一个字节,将前面除首部外的所有字节(第4~15字节)按字节异或计算结果的值,赋值本字节
二、常用命令集
下面展示三个主要命令集,
注: 1. 对应的数据位根据实际情况设置 2. 校验位需要实时生成
以上两条的修改可参照代码区实现
命令名称 | 命令号 | 数据 | 校验和 |
---|---|---|---|
快门校正 | 0x09, 0x00 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 0x** |
增益 | 0x19, 0x00 | 0x**, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | 0x** |
积分时间 | 0x22, 0x00 | 0x**, 0x**, 0x**, 0x00, 0x00, 0x00, 0x00, 0x00 | 0x** |
三、C++示例实现
GHDEV_HND m_DeviceHandle; //64位系统,定义设备句柄,进行命令发送前需先打开设备
//定义命令
unsigned char SHUTTER[16] = {0xFF, 0xFF, 0xAA, 0xFF, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char GAIN[MAX_STR_LENGTH] = {0xFF, 0xFF, 0xAA, 0xFF, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char INT_TIME[MAX_STR_LENGTH] = {0xFF, 0xFF, 0xAA, 0xFF, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
- 打快门
void OnButtonShutter()
{
if(m_DeviceHandle)
{
SHUTTER[7] = 0x00;
SHUTTER[15] = 0x00;
for (int i=3; i<=14; i++)
{
SHUTTER[15] = SHUTTER[15] ^ SHUTTER[i]; //生成最后的校验字节
}
IR_SendSeriaPortCmd(m_DeviceHandle, SHUTTER, sizeof(SHUTTER));
//SDK函数发送命令
}
}
- 配置增益
void OnSetGain(int m_SensorGain)
{
if(m_DeviceHandle)
{
GAIN[7] = m_ SensorGain ; //0->高增益;1->中增益;2->低增益
GAIN[15] = 0x00;
for (int i=3; i<=14; i++)
{
GAIN[15] = GAIN[15] ^ GAIN[i];//生成最后的校验字节
}
IR_SendSeriaPortCmd(m_DeviceHandle, GAIN, sizeof(GAIN));
//SDK函数发送命令
}
}
- 配置积分时间
void OnSetIntTime(int m_SensorIntTime)
{
if(m_DeviceHandle)
{
//下面三行根据积分时间值生成对应字节的数据
INT_TIME[7] = (m_SensorIntTime & 0x00ff);
INT_TIME[8] = (m_SensorIntTime & 0xff00) >> 8;
INT_TIME[9] = (m_SensorIntTime & 0xff0000) >> 16;
INT_TIME[15] = 0x00;
for (int i=3; i<=14; i++)
{
INT_TIME[15] = INT_TIME[15] ^ INT_TIME[i];//生成最后的校验字节
}
IR_SendSeriaPortCmd(m_DeviceHandle, INT_TIME, sizeof(INT_TIME));
//SDK函数发送命令
}
}
总结
本文介绍了国惠相机SDK的命令协议,实现方法。如采用其他开发工具(非VS),同样可以用SDK函数IR_SendSeriaPortCmd进行命令的发送,但要特别注意不同的工具与SDK(C++)数据类型的对应。
注:如果您不使用国惠相机SDK,控制命令可通过串口直接发送,与SDK唯一不同之处是您不可使用IR_SendSeriaPortCmd()函数,您需要通过串口直接发送对应命令的数据