请教STC12C5A60S2串口问题
在程序中,使用了串口中断,并将优先级设置为最低。在程序中为了调试方便,另写了串口发送函数如:void uart0_tx_onebyte(unsigned char cdata)
{
bit bES;
bES=ES;
ES=0;
_nop_();
TI=0;
SBUF=cdata;
TI=0;
while(!TI);
TI=0;
ES=bES;
}
现在存在的问题,虽然在程序里已禁止了ES产生中断,但还是存在一定的概率进入中断,造成while(!TI)死等,看门狗超时复位。不知道大侠们如何解决这个问题。
禁止了中断还会进入? 实际项目中,一看就用while(!TI);就知道你只是想赶快完工 意思是你没有写中断服务了?进了中断?那不是乱了?没乱?那进不进中断和你的WHILE有啥关系?
你是怎么确定他是进了中断的? 试试看吧WHILE前边那个TI = 0去掉 ninghuchong 发表于 2014-10-3 03:01
禁止了中断还会进入?
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 McuPlayer 发表于 2014-10-3 03:27
实际项目中,一看就用while(!TI);就知道你只是想赶快完工
想过在这个判断中加入时间判断如while(!TI&&timeout)能退出循环,但是觉得怎么关不掉串口中断,想不明白,另在这样处理
TI=0;
while(!TI);
TI=0;
能减低进入串口中断程序概率。不知道大侠有什么高招? xiaobendan 发表于 2014-10-3 08:36
试试看吧WHILE前边那个TI = 0去掉
想过在这个判断中加入时间判断如while(!TI&&timeout)能退出循环,但是觉得怎么关不掉串口中断,想不明白,另在这样处理
TI=0;
while(!TI);
TI=0;
能减低进入串口中断程序概率。不知道大侠有什么高招? 补充:使用11.0592M,9600b/s 神奇,禁止了中断也还会进入 没有回答我,怎么确定是进入了中断? xiaobendan 发表于 2014-10-3 10:35
没有回答我,怎么确定是进入了中断?
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 jxcrg_t35 发表于 2014-10-3 10:57
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 ...
“串口中断程序发出的特定字节”?
把你的“串口中断程序”发出来看一下。 jxcrg_t35 发表于 2014-10-3 10:57
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 ...
就是说你有写串口中断服务了? xiaobendan 发表于 2014-10-3 19:30
就是说你有写串口中断服务了?
是的,所以才想不明白 明白,你的意思是中断服务吧TI清零了,所以WHILE在死等。
那么你确认中断是因为你在WHILE之前的发送指令造成的吗?
其实你说的那个延时的程序也可以用啊。你可以在定时器中设置一个timer,然后在WHILE里判断其值为真,退出循环就好。 xiaobendan 发表于 2014-10-4 08:21
明白,你的意思是中断服务吧TI清零了,所以WHILE在死等。
那么你确认中断是因为你在WHILE之前的发送指令造 ...
谢谢你回复,今天加了超时退出机制,确定是进入了中断,作用明显。不会死等啦。
目前在程序里开启了EXT0,1;TIME0,1;UART中断,他们之间互相干扰了?? 今天这样加了超时判断,妈妈再也不用担心我的学习了。
i=1000;
for(;!TI&&(i>0);i--){_nop_();}
TI=0;
不需要串口中断,就不用中断程序啊,如果有接收中断就用if (RI){RI=0;} liyang0727 发表于 2014-10-4 09:28
不需要串口中断,就不用中断程序啊,如果有接收中断就用if (RI){RI=0;}
都需要用的,还可以增加大程序中标志位,在中断程序内判断该标志位,如符合,则退出。
[结贴] 请教STC12C5A60S2串口问题-原因找到
未编写T1的中断程序导致。谢谢大家关注
页:
[1]