TXB0CONbits.TXREQ = 1; //置1,则开始发送 问题如上,在此处,如果不添加后面一句,那么在下一次用发送缓冲区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;//一分钟超时,退出。 } |
我之前用的__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并不会影响定时器的中断。除非别的地方,有一些错误。 这个中断的问题,暂时搁置,以后希望可以明白。 |