import sensor, image, time, math
from pyb import Pin,Timer,UART
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1,read_buf_len=10)
LED1 = Pin('P9', Pin.OUT_PP, Pin.PULL_NONE)
LED1.value(True)
sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE) #灰度图
sensor.set_framesize(sensor.VGA) # 640*480
sensor.set_windowing((640, 300)) # V Res of 80 == less work (40 for 2X the speed).
sensor.skip_frames(time = 1000)#延时1s等待设置生效
sensor.set_auto_gain(False) #关闭自动快门防止图像冲洗
clock = time.clock()
LED1.value(False)
#启用定时器2,频率0.2,发送心跳反馈5s一次
def tick(timer):
LED1.value(True)
#uart.write("STRHBEND")#发送心跳反馈
#print("心跳STRHBEND")
time.sleep(1)
LED1.value(False)
tim = Timer(2, freq=0.2) # create a timer object using timer 2 - trigger at 1Hz
tim.callback(tick) # set the callback to our tick function
#条码类型定义
def barcode_name(code):
if(code.type() == image.EAN2):
return "EAN2"
if(code.type() == image.EAN5):
return "EAN5"
if(code.type() == image.EAN8):
return "EAN8"
if(code.type() == image.UPCE):
return "UPCE"
if(code.type() == image.ISBN10):
return "ISBN10"
if(code.type() == image.UPCA):
return "UPCA"
if(code.type() == image.EAN13):
return "EAN13"
if(code.type() == image.ISBN13):
return "ISBN13"
if(code.type() == image.I25):
return "I25"
if(code.type() == image.DATABAR):
return "DATABAR"
if(code.type() == image.DATABAR_EXP):
return "DATABAR_EXP"
if(code.type() == image.CODABAR):
return "CODABAR"
if(code.type() == image.CODE39):
return "CODE39"
if(code.type() == image.PDF417):
return "PDF417"
if(code.type() == image.CODE93):
return "CODE93"
if(code.type() == image.CODE128):
return "CODE128"
#num=0#扫码计数
flag=0#串口接收标志位
uart_data=0#串口数据
cmd1=b'0'#命令字节1
cmd2=b'0'#命令字节2
while(True):
clock.tick()
code_data="code_data"#条码相关信息
#读串口命令
if uart.any():
uart_data = uart.read(1).decode()#一个字节一个字节分析,避免命令数据间断问题
if (flag==0)&(uart_data=="S"):
flag=1
elif (flag==1)&(uart_data=="T"):
flag=2
elif (flag==2)&(uart_data=="R"):
flag=3
elif(flag==3): #接收命令段2字符
cmd1=uart_data
flag=4
elif(flag==4):
cmd2=uart_data
flag=5
elif(flag==5): #接收序号2字符
num1=uart_data
flag=6
elif(flag==6):
num2=uart_data
flag=7
elif(flag==7)&(uart_data=="E"):
flag=8
elif(flag==8)&(uart_data=="N"):
flag=9
elif(flag==9)&(uart_data=="D"):
flag=10
else:flag=0
#收到STR_ _END 开始读码
if (flag==10)&(cmd1=="R")&(cmd2=="C") :#READ CODE命令
flag=0 #接收标志清零
img = sensor.snapshot()
codes = img.find_barcodes()
i = 0#条码个数统计
for code in codes:
img.draw_rectangle(code.rect(),color=50,thickness=5)
print_args = (barcode_name(code), code.payload(), code.quality(), clock.fps(),num1,num2)
print("条码类型 %s, 码值 \"%s\", 数量 %d, 帧率 %f, 计数 %s%s" % print_args)
#print(", 计数%d"%num)#不换行 , end = ''
#计数值和条码位宽值位2位数,切条码位宽<21,直接发
if ( len(str(code.payload()))>9 ) & ( len(str(code.payload()))<21 ):
#发送STRCV 计数值 条码位宽 条码值 END
code_data=("STRCV%s%s%s%sEND"%(num1,num2,len(str(code.payload())), str(code.payload())))
elif len(str(code.payload())) < 10:#计数补一个字符0,凑足2位
#发送STRCV 计数值 "0"条码位宽 条码值 END
code_data=("STRCV%s%s0%s%sEND"%(num1,num2,len(str(code.payload())), str(code.payload())))
i = i+1#条码个数统计
#LED1.value(False)
#time.sleep(2)
#判断有几个码
if i==1:#只有一个码,直接上传,指示灯闪亮一次
LED1.value(True)
uart.write(code_data)
LED1.value(False)
else:#没有码或者多个码,报错,发NR
uart.write("STRNR%s%sEND"%(num1,num2))
print("没有码, 帧率:%f,计数%s%s" % (clock.fps(),num1,num2 ) )
#flag=0
#心跳信号
elif(flag==10)&(cmd1=="H")&(cmd2=="B"):
uart.write("STRHB%s%sEND"%(num1,num2) )
flag=0#清除命令接收标志