模块学习3:PTC052A-200串口摄像头拍照等功能编写

这是普泰通信的一个RS485摄像机,主要也是通过相关协议进行一个开发使用。大概就是这样的。相应的摄像头规格和通信协议资料我也相应的贴在资源里面。
枪机摄像头
直接根据协议写功能函数。

1、130 万/200 万像素串口摄像头通讯协议(指令的数字均为 16 进制)

上电后需要 3s 启动时间,在此期间,发送指令,摄像头没有回应。用户程序在上电延时 3s 后,可发送复位指令,看摄像头是否有响应,如有响应,说明已经初始化完成,串口会输出如下信息,即可正常拍照了。
Version:PTC2M0 1.02
MEID_Num:00
ImageWidth:1920,ImageHeight:1080
Init end

1.1、查询版本指令

发送:56 00 11 00 返回:76 00 11 00 0B 50 54 43 32 4D 30 20 31 2E 30 30
0B — 是版本字符串长度 11
50 54 43 32 4D 30 20 31 2E 30 30 转字符串表示 PTC2M0 1.02
型号:PTC2M0+空格+主版本 1.次版本号 02(版本号可能会因功能优化而变化),可通过查版本指令验证通讯是否已准备好。

/************************************************
名称:void query_version(uint8_t camera_addres)
功能:摄像机版本查询
输入:摄像机地址(默认0x00)
输出:成功:C_query_version_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Query_version(uint8_t camera_addres)
{
	uint16_t num=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x11;
	CAMER_TX_BUF[num++]=0x00; 
	RS485_Send_String(CAMER_TX_BUF,num);
}

1.2、复位指令

发送:56 00 26 00 返回:76 00 26 00 //发送复位指令约 2-3s 后,会显示这么一串字符,相当于系统重启一次。

/************************************************
名称:void camera_rest(uint8_t camera_addres)
功能:复位摄像头
输入:摄像机地址(默认0x00)
输出:成功:C_take_photos_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Camera_rest(uint8_t camera_addres)
{
	uint16_t num=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x26;
	CAMER_TX_BUF[num++]=0x00; 
	RS485_Send_String(CAMER_TX_BUF,num);
	send_string_uart2_len(Uart1_rcvbuff,Uart1_rcvindex);
}

1.3、拍照指令

发送:56 00 36 01 00 拍照成功返回:76 00 36 00 00
注意:上电,复位后立即进行拍照效果不佳,需等待 2-3s,使摄像头稳定下来后拍照效果即稳定。130 万像素需等待 2s,200 万像素需等待 3s。

/************************************************
名称:void take_photos(uint8_t camera_addres)
功能:拍照控制
输入:摄像机地址(默认0x00)
输出:成功:C_take_photos_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Take_photos(uint8_t camera_addres)
{
	uint16_t num=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x36;
	CAMER_TX_BUF[num++]=01;
	CAMER_TX_BUF[num++]=00; 
	RS485_Send_String(CAMER_TX_BUF,num);
}

1.4、读取所拍图片长度指令

发送:56 00 34 01 + II 返回:76 00 34 00 04 XX XX XX XX
II -------1 个字节表示读取不同的图片缓存,有效范围 0-5,其中 0 号图片缓存固定
为当前拍照的图片,1-5 号的图片缓存空间由移动侦测触发的连拍以及多张连拍指令所共享。
XX XX XX XX -------4 个字节表示图片数据长度。
举例说明:
发送:56 00 34 01 00 返回:76 00 34 00 04 00 01 4B C6
长度说明:0x00014BC6 / 1024 约等于 82.9K 的图片长度

/************************************************
名称:void Read_photo_len(uint8_t camera_addres,uint8_t Cache_block)
功能:读取照片长度
输入:camera_addres:摄像头485地址。
      Cache_block:照片缓存块 范围0-5
输出:成功:C_read_photo_len_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Read_photo_len(uint8_t camera_addres,uint8_t cache_block)
{
	uint16_t num=0;
	if(cache_block>5)cache_block=5;
//	else if(Cache_block<0)Cache_block=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x34;
	CAMER_TX_BUF[num++]=01;
	CAMER_TX_BUF[num++]=cache_block; //照片缓存块
	RS485_Send_String(CAMER_TX_BUF,num);
	send_string_uart2_len(CAMER_TX_BUF,num);
}

1.5、读取所拍图片数据指令

发送:56 00 32 0C II 0A SS SS SS SS LL LL LL LL 00 FF
返回:76 00 32 00 00 FF D8 。。。。。。FF D9 76 00 32 00 00
II ---------------1 个字节表示读取不同的图片缓存,有效范围 0-5,其中 0 号图片缓存固定为
当前拍照的图片,1-5 号的图片缓存空间由移动侦测触发的连拍以及多张连拍指令所共享。
SS SS SS SS —起始地址 4 个字节(必须是 8 的倍数)。
LL LL LL LL —本次读取数据长度 4 个字节,请看下面的举例说明。
注意:完整的 JPEG 图片文件一定是以 FF D8 开始,FF D9 结束。如果是一次性读出整张图片数据,则起始地址是:00 00 00 00 ,本次读取的数据长度为 4.4 指令读出的整张图片的字节长度。读出的数据以 FF D8 开头,FF D9 结尾。
如果要分多次读取图片数据,则第一次读取的起始地址是:00 00 00 00,后几次读取的起始地址是上一次读取数据的末尾地址。
举例说明:
发送:56 00 32 0C 00 0A 00 00 00 00 00 01 4B C6 00 FF
返回:76 00 32 00 00 FF D8 … FF D9 76 00 32 00 00
解释说明:
在这里插入图片描述

表示从 0x00000000 起始位置读取长度为 0x00014BC6 的图片长度数据。

/************************************************
名称:void Read_photo_data(uint8_t camera_addres,uint8_t Cache_block,uint32_t start_address,uint32_t data_len)
功能:读取照片数据
输入:camera_addres:摄像头485地址。
      Cache_block:照片缓存块 范围0-5
			start_address:数据起始位置
			data_len:需要读取的数据长度
输出:成功:C_read_photo_data_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Read_photo_data(uint8_t camera_addres,uint8_t cache_block,uint32_t start_address,uint32_t data_len)
{
	uint16_t num=0;
	if(cache_block>5)cache_block=5;
//	else if(Cache_block<0)Cache_block=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x32;
	CAMER_TX_BUF[num++]=0x0C;
	CAMER_TX_BUF[num++]=cache_block;  //照片缓存块
	CAMER_TX_BUF[num++]=0x0A;	
//	CAMER_TX_BUF[num++]=start_address>>24;
//	CAMER_TX_BUF[num++]=start_address>>16;
//	CAMER_TX_BUF[num++]=start_address>>8;
//	CAMER_TX_BUF[num++]=start_address;
	CAMER_TX_BUF[num++]=0x00;
	CAMER_TX_BUF[num++]=0x00;
	CAMER_TX_BUF[num++]=0x00;
	CAMER_TX_BUF[num++]=0x00;
	
	CAMER_TX_BUF[num++]=data_len>>24;
	CAMER_TX_BUF[num++]=data_len>>16;
	CAMER_TX_BUF[num++]=data_len>>8;
	CAMER_TX_BUF[num++]=data_len;
	CAMER_TX_BUF[num++]=0x00;
	CAMER_TX_BUF[num++]=0xff;
	RS485_Send_String(CAMER_TX_BUF,num);
	send_string_uart2_len(CAMER_TX_BUF,num);
}

1.6、清空图片缓存指令

发送:56 00 36 01 03 返回:76 00 36 00 00

/************************************************
名称:void Clear_photo_cache(uint8_t camera_addres)
功能:清除图片缓存
输入:camera_addres:摄像头485地址。
输出:成功:C_clear_photo_cache; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Clear_photo_cache(uint8_t camera_addres)
{
	uint16_t num=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x36;
	CAMER_TX_BUF[num++]=0x01;
	CAMER_TX_BUF[num++]=0x03; //
	RS485_Send_String(CAMER_TX_BUF,num);
	send_string_uart2_len(Uart1_rcvbuff, Uart1_rcvindex);
}

1.7、设置拍照图片压缩率指令

发送:56 00 31 05 01 01 12 04 XX 返回:76 00 31 00 00
XX 一般选 36 (范围:0x36 ----0x90) 数值越大,图片质量越低,占用空间越小
低于 0x36 时摄像头会默认设置成 0x36,高于 0x90 时,默认会设置成 0x90
建议值:0x36(图片质量高) 0x54(图片质量中) 0x72(图片质量低)
注意:上电默认压缩率 0x36,设置的压缩率掉电不保存,修改图片大小时压缩率会恢复默认 0x36

/************************************************
名称:void Set_photo_compressibility(uint8_t camera_addres,uint8_t ratio)
功能:设置图片压缩率
输入:camera_addres:摄像头485地址。
      ratio:压缩率 范围:0x36 ----0x90    低于 0x36 时摄像头会默认设置成 0x36,高于 0x90 时,默认会设置成 0x90
输出:成功:C_set_photo_compressibility_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Set_photo_compressibility(uint8_t camera_addres,uint8_t ratio)
{
	uint16_t num=0;
	if(ratio>0x90)ratio=0x90;
	else if(ratio<0x36)ratio=0x36;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x31;
	CAMER_TX_BUF[num++]=0X05;
	CAMER_TX_BUF[num++]=0X01; //
	CAMER_TX_BUF[num++]=0X01; 
	CAMER_TX_BUF[num++]=0X12;
	CAMER_TX_BUF[num++]=0X04;
	CAMER_TX_BUF[num++]=ratio; //
	RS485_Send_String(CAMER_TX_BUF,num);
}

1.8、设置拍照图片大小指令

(130 万像素系列图片默认大小为:1280960;200 万像素系列图片默认大小为 19201080)
发送:56 00 31 05 04 01 00 19 11 (320240) 返回:76 00 31 01 00//图片长度约 11.2K
56 00 31 05 04 01 00 19 00 (640
480) //图片长度约 36K
56 00 31 05 04 01 00 19 22 (160120) //图片长度约 4.5K
56 00 31 05 05 01 00 19 33 (1024
768) //图片长度约 80K
56 00 31 05 05 01 00 19 44 (1280720) //图片长度约 92K
56 00 31 05 05 01 00 19 55 (1280
960) //图片长度约 136K
56 00 31 05 05 01 00 19 66 (19201080) //图片长度约 520K
注意:1920
1080 仅支持 200 万像素摄像头及模块,设置图片大小指令后,无需复位,设置后可立即生效,设置数值保存在 flash 中,下次上电同样有效!如需对模块进行初始图片大小设置,也可使用谱泰通信公司专门设计的上位机软件串口摄像头测试工具 V1.08 直接进行设置,一张图片的长度除了与图片尺寸有关,还由实际场景的亮度和色彩所决定。上图图片长度仅为参考。

/************************************************
名称:void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
功能:设置图片大小
输入:camera_addres:摄像头485地址。
      resolution:分辨率
输出:成功:C_read_photo_len_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
{
	uint16_t num=0;
	uint8_t photo_size = 0x05;
	if(resolution ==0x00 || resolution ==0x11 || resolution == 0x22)
		photo_size=0x04;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x31;
	CAMER_TX_BUF[num++]=0X05;
	CAMER_TX_BUF[num++]=photo_size; 
	CAMER_TX_BUF[num++]=0X01;
	CAMER_TX_BUF[num++]=0X00;
	CAMER_TX_BUF[num++]=0X19;
	CAMER_TX_BUF[num++]=resolution; //
	RS485_Send_String(CAMER_TX_BUF,num);
}

1.12、OSD 字符显示设置

发送:56 00 86 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC DD DD … DD 返回:76 00 86 01 ZZ
ZZ 最后一个字节表示 OSD 行数,共 4 行,值为 0-3,表示第 N 行。
发送字段描述:
56 1byte 固定帧头
00 1byte 序号(0-255),默认 0
86 1byte OSD 设置命令
B0 1byte 命令长度,根据文字内容动态变化,固定 12 字节+文字内容总长度
B1 1byte OSD 显示开关,1:启用;0:禁用
B2 1byte 第 N 行(0-3),最多可显示 4 行
B3 1byte 字号 0:字体 16x16;字号 1:字体 24x24;字号 2:字体 32x32
B4B5 2byte X 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918)坐标需偶数
B6B7 2byte Y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078)坐标需偶数
B8B9 2byte 字体颜色 RGB555 顺序
BABB 2byte 背景颜色 RGB555 顺序
BC 1byte 文字长度,最长限制 160 个字符,即 80 个汉字
DD…DD Nbyte 文字内容,仅支持 GB2312 编码汉字和 ASCII
举例说明:
发送:56 00 86 16 01 00 01 00 00 00 00 00 7C FF FF 0A 30 31 32 33 34 35 36 37 38 39
返回:76 00 86 01 00
发送字段描述:
0x56, //固定帧头
0x00, //序号
0x86, //OSD 设置命令
0x16, //命令长度,根据文字内容动态变化,固定 12 字节+文字内容总长度
0x01, //OSD 显示开关,1:启用;0:禁用
0x00, //第 N 行,(0-3)
0x01, //字号 0:字体 16x16;1:字体 24x24;2:字体 32x32
0x00,0x00, //x 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918),坐标需偶数
0x00,0x00, //y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078),坐标需偶数
0x00,0x7C, //字体颜色,蓝色 RGB555 顺序
0xff,0xff, //背景颜色,白色
0x0A, //文字长度,最长限制 160 个字符,即 80 个汉字
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39, //文字内容 ASCII“0123456789”
注意:如果是中文,要以 GB2312 编码方式,一个汉字占 2 字节。
返回字段描述:
0x76, //固定返回帧头
0x00, //序号
0x86, //命令
0x01, //固定数据长度 1
0x00, //设置行数 0-3

/************************************************
名称:void Set_photo_resolution(uint8_t camera_addres,uint8_t resolution)
功能:OSD 字符显示设置
输入:camera_addres:摄像头485地址。
      str_len:写入数据长度
			str_buf:写入数据
输出:成功:C_read_photo_len_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void Set_OSD(uint8_t camera_addres,uint8_t str_len,uint8_t *str_buf)
{
	uint16_t num=0;
	uint8_t i;
	if(str_len>160)str_len=160;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x86;
	CAMER_TX_BUF[num++]=0X00;//后续数据长度
	CAMER_TX_BUF[num++]=0X01; //OSD显示开关 0:禁用   1:启用
	CAMER_TX_BUF[num++]=0X00; //第几行显示(0-3),最多可显示 4 行
	CAMER_TX_BUF[num++]=0X02;//字号 0:字体 16x16;字号 1:字体 24x24;字号 2:字体 32x32
	CAMER_TX_BUF[num++]=0X00;//2byte X 坐标,130W(10 进制 0-1279)坐标需偶数;200W(10 进制 0-1918)坐标需偶数
	CAMER_TX_BUF[num++]=0X00;//
	CAMER_TX_BUF[num++]=0X00;//2byte Y 坐标,130W(10 进制 0-959)坐标需偶数;200W(10 进制 0-1078)坐标需偶数
	CAMER_TX_BUF[num++]=0X00;//
	
	CAMER_TX_BUF[num++]=0X00;//2byte 字体颜色 RGB555 顺序
	CAMER_TX_BUF[num++]=0X00;//
	CAMER_TX_BUF[num++]=0X00;//2byte 背景颜色 RGB555 顺序
	CAMER_TX_BUF[num++]=0X00;//
	CAMER_TX_BUF[num++]=str_len;  // 1byte 文字长度,最长限制 160 个字符,即 80 个汉字
	for(i=0;i<str_len;i++)
	{
		CAMER_TX_BUF[num++]=str_buf[i];			//Nbyte 文字内容,仅支持 GB2312 编码汉字和 ASCII
	}
	CAMER_TX_BUF[3]=num-4;//数据长度
	RS485_Send_String(CAMER_TX_BUF,num);
}

1.16、多张连拍指令

发送:56 00 88 03 B0 B1 B2 返回:76 00 88 01 ZZ
B0 — 1byte 拍照数量,范围 0-5
B1B2 — 2byte 连续拍照间隔时间,单位毫秒,范围 0-65535
ZZ — 1byte 表示设置参数是否有效,0x00有效,0x01无效,例如拍照数量超过有效范 0-5时为
无效返回 0x01
举例说明:
发送:56 00 88 03 03 00 64 返回:76 00 88 01 00
发送字段描述:
0x56 //固定发送帧头
0x00 //序号
0x88 //连拍命令
0x03 //数据长度固定 3 字节
0x03 //连拍图片数量 3 张,有效范围 0-5
0x00 0x64 //连续拍照间隔时间 100 毫秒,范围 0-10000,10 秒
返回字段描述:
0x76 //固定返回帧头
0x00 //序号
0x88 //命令
0x01 //固定数据长度 1
0x00 //表示参数设置成功
注意:
(1)多张连拍指令与移动侦测连拍指令功能相似,是单张拍照指令的扩展,使用更自由方便;
(2)多张连拍指令与移动侦测连拍指令共享 1-5 号图片缓存,不能同时使用,不然会覆盖已缓存的图片,且断电不保存,使用读图片长度指令和读图片数据指令可将 1-5 号图片缓存读取出来;
(3)多张连拍指令的返回时间与连拍间隔时间有关,连拍间隔时间不宜设置过长,因为这段时间串口处于阻塞状态,无法响应其他指令,只有等待应答返回后才可执行其他新指令;
(4)最多支持缓存 6 张图片,先执行多张连拍指令,再执行单张拍照指令:56 00 36 01 00,然后分别读取 0-5 号缓存即可,最后再执行清空缓存指令。

/************************************************
名称:void more_take_photos(uint8_t camera_addres,uint8_t photos_num,uint16_t interval)
功能:多张连拍
输入:camera_addres:摄像头485地址。
      photos_num:;连拍数量
			interval:拍照间隔
输出:成功:C_read_photo_len_success; 失败:C_error
日期:2021-09-13
作者:liuguizhou
************************************************/
void More_take_photos(uint8_t camera_addres,uint8_t photos_num,uint16_t interval)
{
	uint16_t num=0;
	if(photos_num>5)photos_num=5;
//	else if(photos_num<0)photos_num=0;
	if(interval>10000)interval=10000;
//	else if(interval<0)interval=0;
	CAMER_TX_BUF[num++]=0x56;
	CAMER_TX_BUF[num++]=Camera_addres; //485地址
	CAMER_TX_BUF[num++]=0x88;
	CAMER_TX_BUF[num++]=0X03;
	CAMER_TX_BUF[num++]=photos_num; //
	CAMER_TX_BUF[num++]=interval>>8; 
	CAMER_TX_BUF[num++]=interval;
	RS485_Send_String(CAMER_TX_BUF,num);
}

总结

以上就是对摄像机的各个功能函数的编写,剩下就是将他们组合完成我们后续功能。后期可能会将拍摄的照片通过FTP上传到平台。哪里的话,还需要对图片数据进行处理,可能一包数据无法完全上传一张图片,所以可能一张图片还需要分成几包数据上传。这一块的处理还在测试完善,就不上贴了。
以下资料已经上传的我的资源中心,有需要可以免费下载!

在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瓜洲大大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值