"""#TPYBoard v102 驅(qū)動(dòng)串口攝像頭PTC06 拍照并保存到TF卡#------------------------------------------------------#作者:山東蘿卜電子科技有限公司#時(shí)間:2018年03月15日"""import pybfrom pyb import UART,Switch"""拍照的基本流程--------------------1.清空?qǐng)D片緩存2.發(fā)送拍照命令3.獲取圖片的長度4.根據(jù)長度讀取圖片數(shù)據(jù)使用到的指令與返回的數(shù)據(jù)格式-------------------------------復(fù)位0x56 0x00 0x26 0x00返回0x76 0x00 0x26 0x00 +DSP 版本信息+Init end------------------------清空?qǐng)D片緩存 0x56 0x00 0x36 0x01 0x02返回0x76 0x00 0x36 0x00 0x00-------------------------拍照命令0x56 0x00 0x36 0x01 0x00返回0x76 0x00 0x36 0x00 0x00--------------------------讀所拍圖片的長度56 00 34 01 00返回0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY(XX 為高位字節(jié),YY 為低位字節(jié))--------------------------讀取圖片數(shù)據(jù)0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFFAA BB:起始地址(先高位字節(jié),后低位字節(jié).必須是8的倍數(shù))XX YY:本次讀的數(shù)據(jù)長度(先高位字節(jié),后低位字節(jié))返回76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00(完整的JPEG 圖片文件是以 FF D8 開始 FF D9 結(jié)尾)"""#-----Command---------#initcmd=b'\x56\x00\x26\x00' #復(fù)位指令clearcmd=b'\x56\x00\x36\x01\x02' #清除緩存photocmd=b'\x56\x00\x36\x01\x00' #拍照lengthcmd=b'\x56\x00\x34\x01\x00' #獲取圖片長度readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #獲取圖片數(shù)據(jù)responseCmd=b'\x76\x00\x32\x00\x00'#返回的圖片數(shù)據(jù)固定頭和尾#---------------------------------#isFlag=0#標(biāo)識(shí)是否初始化isPhoto=0#標(biāo)識(shí)是否發(fā)送拍照命令num=1f_name='/sd/photo%s.jpeg'#保存的文件名稱nBytes=512#每次讀取的字節(jié)數(shù)#---------------------------------#uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2#------將10進(jìn)制轉(zhuǎn)為16進(jìn)制字節(jié)數(shù)組--------#def convert_Data(num): if num>255: num_h=hex(num) if len(num_h)<6: num_h_a=num_h[:3] num_h_b='0x'+num_h[3:] else: num_h_a=num_h[:4] num_h_b='0x'+num_h[4:] byte_num=bytes([int(num_h_a,16),int(num_h_b,16)]) else: byte_num=b'\x00'+bytes([num]) return byte_num#---------------------------------#函數(shù)名:get_photo#描述:獲取圖片數(shù)據(jù)#參數(shù):起始地址、讀取長度#返回:成功返回正常數(shù)據(jù),失敗返回0#---------------------------------/def get_photo(add,readlen): global readcmd,responseCmd cmd=readcmd+add+b'\x00\x00'+readlen+b'\x00\xFF' uart.write(cmd) while uart.any()<=0: continue data=uart.read() #print('data:',data) #print('data[0:5]:',data[0:5]) #print('data[-5:]:',data[-5:]) if data[0:5]==responseCmd and data[-5:]==responseCmd: revdata=data[5:-5] print('revdata:',revdata) else: revdata=0 return revdata#---------------------------------#函數(shù)名:test#描述:USR按鍵的回調(diào)函數(shù)。#按鍵每按1次拍照1次#---------------------------------/def test(): global num,isPhoto pyb.delay(30) if(sw()): sw.callback(None)#正在獲取數(shù)據(jù)時(shí) 禁用回調(diào) isPhoto=0 num+=1 pyb.LED(3).on() #清除緩存 uart.write(clearcmd)#等待模塊上電完畢 print('wait......')pyb.delay(2800)print('init start.......')uart.write(initcmd)sw=Switch()sw.callback(test)while True: if uart.any()>0: data=uart.read() print('revdata:',data) if isFlag==0: #說明接收的是復(fù)位后的信息 if data==b'Init end\r\n': #復(fù)位完畢 print('init ok.......') pyb.delay(2000) isFlag=1 pyb.LED(2).on() else: if len(data)>=5: if data[0]==118:#0x76 if data[2]==54:#0x36 if isPhoto==0: #清除緩存返回 print('-----clear buffer ok----') isPhoto=1 uart.write(photocmd) else: #拍照返回 print('-----taking pictures ok----') uart.write(lengthcmd) if data[2]==52:#0x34 print('photo length:',data[7],'-',data[8]) tlen=data[7]*256+data[8] t_c=tlen//nBytes t_y=tlen%nBytes add=0 #256=[0x01,0x00] 512=[0x02,0x00] length=convert_Data(nBytes) name=f_name % str(num) print('filename:',name) for i in range(0,t_c): add=convert_Data(i*nBytes) #每512字節(jié)寫一次 revdata=get_photo(add,length) if revdata!=0: f=open(name,'a') f.write(revdata) f.close() pyb.LED(4).toggle() print('-------------',i) pyb.delay(100) add=convert_Data(t_c*nBytes) revdata=get_photo(add,convert_Data(t_y)) if revdata!=0: f=open(name,'a') f.write(revdata) f.close() pyb.LED(3).off() pyb.LED(4).off() pyb.delay(100) print('*========================================*') sw.callback(test) else: print('-----data length error-----')
聯(lián)系客服