@kidswong999 就这么沉了么
4yx1 发布的帖子
-
RE: 关于CAN接受函数等待问题
@kidswong999 我外接的can收发器,用创芯的can分析仪做的数据采集,截图是分析仪的上位机
1can收发器 2创芯can分析仪 3我在我的控制器做了一个数据通讯显示 -
RE: 关于CAN接受函数等待问题
#这是从源程序里截取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随机发送,中断,看运行稳定程度##########
-
RE: 关于CAN接受函数等待问题
@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)] #从新映射初始化
-
RE: 关于CAN接受函数等待问题
@kidswong999 在 关于CAN接受函数等待问题 中说:
try catch
can.recv函数在教程上没有更多的拓展说明,正常使用can总线的模块timeout的意义是复位寄存器最后一次的数据,也就是在设定的时间ms内,如果没有收到报文就会把当前寄存器内的数据全部清零或者改写为复位值,如果设置为0或者-1,取消清零。系统不会因为timeout报错。
但是目前can.recv函数timeout更像是一个复位计时器,每次收到数据就清零从新计时,不然就一直卡住程序等待收数据再执行,过了时间就报错停止运行了。 -
RE: 关于CAN接受函数等待问题
@4yx1 在 关于CAN接受函数等待问题 中说:
H7plus模块,需要用can总线传输图像采集处理后的关键参数,发送通过定时器中断定时发送,目前没有问题
但是接收报文放在主循环里就出现了问题:1、can报文接收函数是等待机制,放到主循环如果没有“收到报文”主循环就卡在“等待报文”环节阻止循环,除中断外的所有的处理就停了。2、如果始终有接受id的报文输入,通讯速率必须大约等于循环FPS,不然整体帧率就被拖下来了。
。
请问官方有什么方法能够把这种接收的“同步机制”调整成为异步的,不影响主循环效率。
win7系统 固件版本4.4.2 -
关于CAN接受函数等待问题
H7模块,需要用can总线传输图像采集处理后的关键参数,发送通过定时器中断定时发送,目前没有问题
但是接收报文放在主循环里就出现了问题:1、can报文接收函数是等待机制,放到主循环如果没有“收到报文”主循环就卡在“等待报文”环节阻止循环,除中断外的所有的处理就停了。2、如果始终有接受id的报文输入,通讯速率必须大约等于循环FPS,不然整体帧率就被拖下来了。 。
请问官方有什么方法能够把这种接收的“同步机制”调整成为异步的,不影响主循环效率。