下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
rookiecalf:
用中断或者定时器来合理使用
下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
Chess Shung:
我在想 能不能在循环里执行一个计时的东西 假如超过了规定时间 就自动退出循环了
下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
rookiecalf:
回复 Chess Shung:
要用外设本身的中断,确保只有事件触发才去执行。
下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
beidoubushixing:
如果收发有问题(表达式为假)的时候,请问怎么进入while循环体中的?
下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
Chess Shung:
回复 beidoubushixing:
问题已解决,我找到办法了
下面是我写的邮箱 0 的接收代码:
while(ECanbRegs.CANRMP.bit.RMP0 == 1) {ECanbMboxes.MBOX0.MDL.all = CAN_RX_BUF_L[0];ECanbMboxes.MBOX0.MDH.all = CAN_RX_BUF_H[0];ECanbShadow.CANRMP.bit.RMP0 = 1;ECanbRegs.CANRMP.all = ECanbShadow.CANRMP.all; }
接着下面是一部分发送代码:
ECanbMboxes.MBOX6.MDL.all = CAN_TX_BUF_L[0]; ECanbMboxes.MBOX6.MDH.all = CAN_TX_BUF_H[0]; while(ECanbRegs.CANTA.all != 0x3c0); ECanbShadow.CANTA.all = 0x3c0; ECanbRegs.CANTA.all = ECanbShadow.CANTA.all;
这段代码实现CAN收发是绝对没问题的。但是现在 技术总监 告诉我说,
不允许用 while 循环,说万一收发有问题, 程序在一直在 while 循环里跑了。
请问这要如何是好?
beidoubushixing:
回复 Chess Shung:
是怎么解决的呢?用if语句吗?