Code Bye

PIC CAN发送中对错误的处理

 

    TXB0CONbits.TXREQ = 1; //置1,则开始发送
    while(TXB0CONbits.TXREQ);//等待其发送完毕,问题在于,如果总线上其他设备都已关闭,则会发送失败,在此处死循环

    问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区0时,就会无法发送。但如果添加上此句,那么我关闭上位机时,就会在此处死循环。

   我知道有错误中断,我自己试了几次,却各种不成功。
   
   来此求解决方法。

100分
#include <windows.h>
//...
TXB0CONbits.TXREQ = 1; //置1,则开始发送
int n;
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
 Sleep(100);//延时100ms
 n++;
 if (n>=600) break;//一分钟超时,退出。
}
引用 1 楼 zhao4zhong1 的回复:
#include <windows.h>
//...
TXB0CONbits.TXREQ = 1; //置1,则开始发送
int n;
while(1) {
 if (!TXB0CONbits.TXREQ) break;//发送完毕,退出
 Sleep(100);//延时100ms
 n++;
 if (n>=600) break;//一分钟超时,退出。
}

我之前用的__delay的函数,但是存在一个问题,因为我计算积分需要精确的定时,但据说__delay中无法进行定时器中断,是这样么?

我又试了一个上午的中断,无奈的是,貌似IRXIE与IRXIF都不听我的指挥,至少ICD3上的变量表上的值一直不变,但我总觉得实际上是变的。不然不可能在我关闭上位机时,可以进入中断,而第二次发送时却又无法进入了。也不可能发生如下情况,中断将IRXIE关闭,才可以避免连续地反复进入中断,我之所以这么做,是因为我怎么也无法将IRXIF置1。我想过,有无可能中断的进入,其实与IRXIE无关,一直显示0,只是进入之后,判断IRXIF成功了,一直显示1。但并没有找到其他任何低级中断。
最后使用的办法是, 
while(TXB0CONbits.TXREQ)
    {
       // if (!TXB2CONbits.TXREQ) break;
        if(TXB0CONbits.TXERR)//break;
            TXB0CONbits.TXREQ=0;
       // __delay_ms(2);
    }
此外,经过测试,delay并不会影响定时器的中断。除非别的地方,有一些错误。
这个中断的问题,暂时搁置,以后希望可以明白。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明PIC CAN发送中对错误的处理