• OpenMV VSCode 扩展发布了,在插件市场直接搜索OpenMV就可以安装
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 关于CAN接受函数等待问题



    • H7模块,需要用can总线传输图像采集处理后的关键参数,发送通过定时器中断定时发送,目前没有问题0_1727227290323_定时器中断发送can报文.jpg
      但是接收报文放在主循环里就出现了问题:1、can报文接收函数是等待机制,放到主循环如果没有“收到报文”主循环就卡在“等待报文”环节阻止循环,除中断外的所有的处理就停了。2、如果始终有接受id的报文输入,通讯速率必须大约等于循环FPS,不然整体帧率就被拖下来了。0_1727227805061_接受报文.jpg
      请问官方有什么方法能够把这种接收的“同步机制”调整成为异步的,不影响主循环效率。



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

      H7plus模块,需要用can总线传输图像采集处理后的关键参数,发送通过定时器中断定时发送,目前没有问题0_1727227290323_定时器中断发送can报文.jpg
      但是接收报文放在主循环里就出现了问题:1、can报文接收函数是等待机制,放到主循环如果没有“收到报文”主循环就卡在“等待报文”环节阻止循环,除中断外的所有的处理就停了。2、如果始终有接受id的报文输入,通讯速率必须大约等于循环FPS,不然整体帧率就被拖下来了。
      0_1727227805061_接受报文.jpg
      请问官方有什么方法能够把这种接收的“同步机制”调整成为异步的,不影响主循环效率。
      win7系统 固件版本4.4.2



    • 你把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我在我的控制器做了一个数据通讯显示



    • @kidswong999 就这么沉了么