• 免费好用的星瞳AI云服务上线!简单标注,云端训练,支持OpenMV H7和OpenMV H7 Plus。可以替代edge impulse。 https://forum.singtown.com/topic/9519
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 关于CAN接受函数等待问题



    • 你把timeout改为1ms。



    • @kidswong999 改低了报文速度跟不上或者不给发接收的报文就报错了,所以才给个-1,结果主循环在等待报文才运行🤣
      0_1727336741088_15677.jpg



    • 你用try catch捕获异常不行吗?



    • @kidswong999关于CAN接受函数等待问题 中说:

      try catch

      can.recv函数在教程上没有更多的拓展说明,正常使用can总线的模块timeout的意义是复位寄存器最后一次的数据,也就是在设定的时间ms内,如果没有收到报文就会把当前寄存器内的数据全部清零或者改写为复位值,如果设置为0或者-1,取消清零。系统不会因为timeout报错。
      但是目前can.recv函数timeout更像是一个复位计时器,每次收到数据就清零从新计时,不然就一直卡住程序等待收数据再执行,过了时间就报错停止运行了。



    • @kidswong999
      try catch可以解决报错,但是timeout成了延时的效果是没法解决的,他的等待时间阻碍了主程序运行



    • @kidswong999
      这是目前能做到不影响主循环的结果,最后两句怎么优化能简单点?没学过python靠着基础语言点底子

      #系统板载can.recv函数中的timeout类似延时等待函数,超过设定时间收不到信息报错,只能在try里通过循环时长初略模拟真实的timeout功能
          try:
              can.recv(0, lst,timeout=0)    #主循环周期,接受can报文
              i=0
          except OSError:  #设置can.recv真实timeout时间,设定timeout时间(ms)=1000ms/FPS*i
              i+=1
              if i>10:
                 i=0
                 ############以下2句本意是想把接受FIFO清零,但是不知道如何处理,只能重新让系统分配内存初始化一遍##########
                 RE=bytearray(8)     #大于i次就真实的执行timeout,把RE寄存器复位为0,重新初始化一遍
                 lst = [0, 0, 0, 0, memoryview(RE)]  #从新映射初始化
      


    • 你把全部的代码发一下



    • @kidswong999

      #这是从源程序里截取can部分的实例,源程序中涉及图像的策略太多,只把影响can接受的部分摘取出来说明
      
      import sensor,time, omv, pyb
      from pyb import CAN, Timer
      
      i = 0
      RE = bytearray(8)
      SE = bytearray(8)
      lst = [0, 0, 0, 0, memoryview(RE)]
      can = CAN(2, CAN.NORMAL, baudrate=250_000, sample_point=75)
      can.restart()
      can.setfilter(0, CAN.RANGE, 0, (2, 2))
      ######################设置定时器中断,can报文固定周期发送#############
      def tick4(timer):
      
          can.send(SE, 5)
      
      tim = Timer(4, freq=10)      #定时器4  100ms定时发送
      tim.callback(tick4)
      ################################################################
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QVGA)
      sensor.skip_frames(time = 2000)
      clock = time.clock()
      while True:
          clock.tick()
          img = sensor.snapshot()  #压制一下帧率,不然循环太快了
          #系统板载can.recv函数中的timeout类似延时等待函数,超过设定时间收不到信息报错,只能在try里通过循环时长初略模拟真实的timeout功能
          try:
              can.recv(0, lst,timeout=0)    #主循环周期,接受can报文,timeout=0不占用“等待时间”
              i=0
          except OSError:  #设置can.recv真实timeout时间,设定timeout时间(ms)=1000ms/FPS*i
              i+=1
              if i>10:
                 i=0
                 ############以下2句本意是想把接受FIFO清零,只想针对固定地址操作,但是不知道如何处理,只能重新让系统分配内存初始化一遍,担心系统内存会溢出##########
                 RE=bytearray(8)     #大于i次就真实的执行timeout,把RE寄存器复位为0,重新初始化一遍
                 lst = [0, 0, 0, 0, memoryview(RE)]  #从新映射初始化
          SE=RE
          print(SE,clock.fps())
      
          ######CAN仿真盒发送速率为100ms,数据递增发送,测试过程can随机发送,中断,看运行稳定程度##########
      

      0_1728693362894_e54408ca-4b7f-4b69-b6aa-29358b7dbcb7-image.png



    • 你这个是什么调试器吗?我可以测试一下。



    • @kidswong999 我外接的can收发器,用创芯的can分析仪做的数据采集,截图是分析仪的上位机
      0_1728859312452_47cd2080-dec5-4c42-8e09-68af5d95855a-image.png
      1can收发器 2创芯can分析仪 3我在我的控制器做了一个数据通讯显示