完整word版串口摄像头通信协议.docx
《完整word版串口摄像头通信协议.docx》由会员分享,可在线阅读,更多相关《完整word版串口摄像头通信协议.docx(16页珍藏版)》请在冰豆网上搜索。
完整word版串口摄像头通信协议
串口摄像头说明书
一、串口摄像头介绍
1、SXH485-V1串口摄像头是一款具有视频采集和图像压缩功能的摄像头,具有130万象素CMOS摄像头,最大分辨率可达到1280×960,它是一个内含有拍摄控制、视频捕捉、图像数据采集、图像JPEG压缩、串口通讯等功能的齐全的工业用图像采集设备。
采用标准的JPEG图像压缩算法,本产品的图像输出格式与常用计算机完全兼容。
同时,本产品带有可选择的红外照明功能,能够实现自动照度补偿、在黑暗的光线下仍能较好的图片质量。
该摄像头的接口为标准的232接口,能够很方便和与各种计算机和嵌入式控制系统、数据传输系统相连。
同时使用485接口时可以方便控制设备接入多个摄像头。
最大串口通讯速率可达115200bps。
支持的通讯速率为:
4800、9600、19200、57600、115200,设备默认通讯波特率为115200,可以通过命令配置。
2、摄像头测试方法
具有485接口的摄像头连接pc进行镜头调试、参数设置的时候需要通过一个485转换器和PC的232接口连接。
485数据线只需要两根线,称为A、B或485+、485-。
连接的时候将摄像头的两根485数据线和转换器的两根数据线连接,转换器上的电源(+5v)和地不用连接。
另外给摄像头提供一个5v电源,接到摄像头的+5V和GND端即可。
注意485的数据线有正负之分,接错不会造成设备损坏,但不能正常通讯,此时交换一下即可。
摄像头的电源一定不能接错,否则会烧坏摄像头。
3、基本参数
1、通讯接口,RS232或485接口,支持通讯波特率为:
4800、9600、19200、57600
2、工作电压为5V-12V宽电压设计。
3、支持分辨率为:
1280×960
640×480(其中又分为高、中、低三个质量的图片)
320×240(同上)
160×160(同上)
4、配备红外灯,在拍摄时,自动点亮,以实现夜视以及省电功能。
5、摄像头应该具备自适应功能,即对外界的光线强弱具备一定的适应性,以保证在任何情况下都能获得在该情况下所能获得的最佳质量的图片。
6、应具备低功耗工作,在低功耗模式工作电流应小于或等于10mA,正常模式工作电流应小于或等于120mA(不启动红外灯的状态)。
二、摄像头接口协议
1、基本报文格式介绍
串口摄像头采用可以支持232或485接口进行通讯,其通讯协议保持一致。
下行(到摄像头)报文的基本格式如下:
报文头
2字节
摄像头地址
1字节
报文类型
1字节
报文长度
2字节
命令参数
<(65536-9)
CRC校验码
2字节
报文头:
固定两个字节0X90EB,第一个字节是0XEB,第二个字节是0X90;
摄像头地址:
每个摄像头都可以设定一个地址,地址范围从0-255,其中地址0保留,地址255用于广播报文。
每个摄像头只处理地址和自己内部设定的地址相同的报文,地址不等当作无效报文。
报文类型:
定义具体的命令类型,主要命令见下表
报文类型(16进制)
命令说明
备注
0x01
测试摄像头
0x02
按照报文给定的图像参数拍照并传输图像数据,
一次传输完全部图象数据,注意该协议返回的数据长度是三个字节,没有状态字节,状态字节对应图象数据长度的高字节,
最大支持16M字节的图象大小。
0x03
设置对比度
未实现
0x04
设置亮度
未实现
0x05
按照报文给定的图象参数拍照,并返回图像长度
0x06
传输图像数据
0x08
关闭、打开红外灯
0x0a
修改波特率不保存
新的波特率不会保存,重新上电后仍然回复到原来的波特率
0x0b
修改波特率参数并保存参数
0x0c
强制摄像头进入低功耗状态
未实现
0x0d
修改摄像头的ID
0x12
按照报文给定的图像参数拍照并传输图像数据,
一次传输完全部图象数据,注意该协议返回的数据长度是三个字节,没有状态字节,状态字节对应图象数据长度的高字节,
最大支持16M字节的图象大小。
0x30
请求拍照,以默认的压缩比和图象大小进行拍照,拍照结束返回图象大小,如果修改过图象大小参数,会以最后一次的图象大小进行拍照
返回拍照的图片大小
0x31
请求传输指定包的图像数据
必须顺序传递,从第0包开始,不可以随机请求
0x32
设置分包传输的包大小
默认512字节,包大小必须是128的倍数
0x33
报告上次拍照命令拍摄的图片数据大小
0x34
设置默认的图象分辨率
0x30开始的命令主要用于分包传输协议,就是主机端没有大的缓存时可以使用这些指令。
报文长度:
定义报文的数据长度,只计算命令参数部分的数据长度。
CRC校验码:
从摄像头地址字节开始到命令参数结束部分数据的CRC校验码。
校验码错误的报文作为无效报文丢弃。
CRC校验码计算公式:
C语言算法代码如下:
staticconstunsignedshortcrc_ta[256]={/*CRC余式表*/
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
};
unsignedshortcal_crc(unsignedchar*ptr,unsignedshortlen)
{
unsignedshortcrc;
unsignedcharda;
crc=0;
while(len--!
=0){
da=(unsignedchar)(crc/256);/*以8位二进制数的形式暂存CRC的高8位*/
crc<<=8;/*左移8位,相当于CRC的低8位乘以*/
crc^=crc_ta[da^*ptr];/*高8位和当前字节相加后再查表求CRC,再加上以前的CRC*/
ptr++;
}
return(crc);
}
上行报文的基本格式如下:
报文头
2字节
摄像头地址
1字节
报文类型
1字节
报文长度
2字节
状态
1字节
数据<(65536-9)
CRC校验码
2字节
状态:
1字节的状态字节,反映了摄像头的当前状态
D7
D6
D5
D4
D3
D2
D1
D0
=1图像数据大于64K,请求续传
=0正常
保留
保留
保留
保留
保留
保留
=1摄像头内部错误
=0正常
2、具体命令介绍
1、测试摄像头
命令类型:
0x01
命令长度:
0x0002
命令参数:
0x55aa
返回:
数据长度:
0x0002
数据内容:
0xaa55
举例:
发送到摄像头:
90eb0101020055aa0000
返回:
90eb01010200aa550000
2、拍照并传输图像数据
命令类型:
0x02
命令长度:
0x0002
命令参数:
字节1代表图像的分辨率,取值范围见下表
分辨率代码
分辨率
备注
1
160*120
2
128*96
3
320*240
4
128*160
5
640*480
6
1152*864
7
1280*960
字节2代表图像的压缩比,取值范围0-4,共5个等级,0时压缩比最小,图像效果最好。
返回:
注意:
该上行报文取消了摄像头状态字节,该字节被图象长度的第三字节取代,该字节和数据长度两字节一起形成一个三字节的数据长度。
数据长度:
压缩后图象数据的大小
数据内容:
压缩后的完整jpeg数据
举例:
命令
90eb0102020005010000
其中90eb为包头,01摄象头id,02为拍照命令,0200为参数长度,05为分辨率,01为压缩比,0000为crc16。
返回拍照数据
90eb0102042306ffd8……..
其中的042306三个字节代表照片的数据长度是394275字节,后面跟的数据。
3、设置对比度
命令类型:
0x03
命令长度:
0x0001
命令参数:
对比度大小,对比度值以0x80为中间值上下波动。
返回:
状态字节:
00
数据长度:
0x0001
数据内容:
设定的对比度值
4、设置亮度
命令类型:
0x04
命令长度:
0x0001
命令参数:
亮度大小,亮度值以0x80为中间值上下波动。
返回:
状态字节:
00
数据长度:
0x0001
数据内容:
设定的亮度值
5、拍照
命令类型:
0x05
命令长度:
0x0002
命令参数:
字节1代表图像的分辨率,取值范围见上表
字节2代表图像的压缩比,取值范围0-4,共5个等级,0时压缩比最小,图像效果最好。
返回:
状态字节:
D7=1;标识图像数据大于64K
数据长度:
0x0004
数据内容:
4字节压缩后图象数据的大小
6、传输图像数据
命令类型:
0x06
命令长度:
0x0000
命令参数:
无
返回:
状态字节:
D7=1;标识图像数据大于64K,需要紧跟一个获取后续数据的报文,才可以取得完整的图象数据
数据长度:
压缩后图象数据的大小
数据内容:
压缩后的完整jpeg数据
7、红外灯控制
命令类型:
0x08
命令长度:
0x0001
命令参数:
红外灯开关0x33=打开0xCC=关闭
返回:
数据长度:
0x0001
数据内容:
红外灯开关值
8、修改波特率参数
命令类型:
0x0a
命令长度:
0x0001
命令参数:
01=4800
02=9600
03=19200
04=19200
05=57600
06=57600
返回:
无
例:
需要设置9600的波特率,命令如下:
90EBID0A010002CRC1CRC2
其它的波特率需要定制,无特别说明默认的波特率是57600,该命令修改后的波特率不会被保存,重新上电以后仍然回到原来的波特率。
9、修改波特率参数并保存
命令类型:
0x0b
命令长度:
0x0002
命令参数:
01=4800
02=9600
03=19200
05=57600
注意:
能修改4种拨特率,波特率为其他的波特率时,是不能修改波特率的。
其它的波特率需要定制,无特别说明默认的波特率是57600
返回:
无
例:
需要设置9600的波特率,命令如下:
90EBID0B02000202CRC1CRC2
其它的波特率需要定制,无特别说明默认的波特率是57600
该命令修改后的波特率会被保存,重新上电后使用新的波特率。
10、修改摄像头ID标识
命令类型:
0x0d
命令长度:
0x0001
命令参数:
新的ID标识号,可以取值范围为1-255
返回:
数据长度:
0x0001
数据内容:
新的ID号
例:
需要设置ID=2时,命令如下:
90EB原来ID号0D010002CRC1CRC2
11、拍照并传输黑白图像数据
命令类型:
0x12
命令长度:
0x0002
命令参数:
字节1代表图像的分辨率,取值范围见下表
分辨率代码
分辨率
备注
0
128*120
1
160*120
2
128*96
3
320*240
4
128*160
5
640*480
6
1152*864
7
1280*960
字节2代表图像的压缩比,取值范围0-4,共5个等级,0时压缩比最小,图像效果最好。
返回:
注意:
该上行报文取消了摄像头状态字节,该字节被图象长度的第三字节取代,该字节和数据长度两字节一起形成一个三字节的数据长度。
数据长度:
压缩后图象数据的大小
数据内容:
压缩后的完整jpeg数据
举例:
90eb0102042306020000
其中的042306三个字节代表数据长度394275字节的数据长度
12、分包传输图像数据时请求拍照命令
命令类型:
0x30
命令长度:
0x0000
命令参数:
无
返回:
拍照成功后返回图像数据的大小,一共4个字节,低字节在前。
数据长度:
0x0005
例:
需要拍照时,命令如下:
90EBID号300000CRC1CRC2
返回:
90EBID号300700状态字节LEN1LEN2LEN3LEN4PLEN11PLEN2CRC1CRC2
比如命令为
90eb013000000000
返回
90EB0130070000793600001C00724E
其中0700为字节长度,00为状态字节,79360000为照片数据大小,1C00为包的数目,724E为CRC.
13、请求按分包传输图像数据
命令类型:
0x31
命令长度:
0x0002
命令参数:
请求的图像数据包号,占两个字节,最大可达65536个数据包
返回:
返回指定包的图像数据的大小
数据长度:
数据内容:
图像数据
例:
请求包号1的命令如下:
90EBID号3102000100CRC1CRC2
返回:
90EBID号31命令长度1命令长度2状态字节包号L包号H数据CRC1CRC2
返回的命令长度=指定包数据+包号2字节+状态1字节,如果不是最后一个包,包数据大小就是包长度。
按分包传输图像数据时,必须先发送分包拍照命令(0x30),拍照成功后必须从0包顺序传递,不可以随机传送任意包号的数据。
14、设置分包传输图像数据时的包大小,默认是512字节
命令类型:
0x32
命令长度:
0x0002
命令参数:
数据包大小,占两个字节,包大小必须是128的整数倍,如12825651210242048等
返回:
返回指定包的图像数据的大小
数据长度:
0x0003
数据内容:
新的数据包大小
例:
设定512包的命令如下:
90EBID号3202000002CRC1CRC2
返回:
90EBID号320300STA0002CRC1CRC2
15、设置分包拍照的默认图像分辨率
命令类型:
0x34
命令长度:
0x0001
命令参数:
图像分辨率代码,见下表
分辨率代码
分辨率
备注
1
160*120
3
320*240
5
640*480
7
1280*960
返回:
返回指定包的图像数据的大小
数据长度:
0x0002
数据内容:
新的数据包大小
例:
设定640×480的命令如下:
90EBID号34010005CRC1CRC2
返回:
90EBID号340200STA05CRC1CRC2
图示2:
分包传输时一幅完整图片采集流程1
注意:
此流程仅供参考,设计中应包含但不限于如下流程,即对一下采集流程兼容。