TI中文支持网
TI专业的中文技术问题搜集分享网站

工程上用的CAN通信里不能用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 循环里跑了。

请问这要如何是好?

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语句吗?

赞(0)
未经允许不得转载:TI中文支持网 » 工程上用的CAN通信里不能用while循环吗?
分享到: 更多 (0)