星瞳实验室APP,快速收到回复
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • if uart.any():是在中断里执行么?



    • 下面这段程序是在中断里执行么
      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



    • 需要全部代码文本。



    • 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#清除命令接收标志