关于CAN接受函数等待问题
-
你把timeout改为1ms。
-
@kidswong999 改低了报文速度跟不上或者不给发接收的报文就报错了,所以才给个-1,结果主循环在等待报文才运行
-
你用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)] #从新映射初始化
-
你把全部的代码发一下
-
#这是从源程序里截取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随机发送,中断,看运行稳定程度##########
-
你这个是什么调试器吗?我可以测试一下。
-
@kidswong999 我外接的can收发器,用创芯的can分析仪做的数据采集,截图是分析仪的上位机
1can收发器 2创芯can分析仪 3我在我的控制器做了一个数据通讯显示
-
@kidswong999 就这么沉了么