jxcrg_t35 发表于 2014-10-3 01:30:32

请教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)死等,看门狗超时复位。不知道大侠们如何解决这个问题。

ninghuchong 发表于 2014-10-3 03:01:50

禁止了中断还会进入?

McuPlayer 发表于 2014-10-3 03:27:33

实际项目中,一看就用while(!TI);就知道你只是想赶快完工

xiaobendan 发表于 2014-10-3 08:13:22

意思是你没有写中断服务了?进了中断?那不是乱了?没乱?那进不进中断和你的WHILE有啥关系?
你是怎么确定他是进了中断的?

xiaobendan 发表于 2014-10-3 08:36:46

试试看吧WHILE前边那个TI = 0去掉

jxcrg_t35 发表于 2014-10-3 09:27:39

ninghuchong 发表于 2014-10-3 03:01
禁止了中断还会进入?

是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。

jxcrg_t35 发表于 2014-10-3 09:31:29

McuPlayer 发表于 2014-10-3 03:27
实际项目中,一看就用while(!TI);就知道你只是想赶快完工

想过在这个判断中加入时间判断如while(!TI&&timeout)能退出循环,但是觉得怎么关不掉串口中断,想不明白,另在这样处理
TI=0;
      while(!TI);
      TI=0;
能减低进入串口中断程序概率。不知道大侠有什么高招?

jxcrg_t35 发表于 2014-10-3 09:32:52

xiaobendan 发表于 2014-10-3 08:36
试试看吧WHILE前边那个TI = 0去掉

想过在这个判断中加入时间判断如while(!TI&&timeout)能退出循环,但是觉得怎么关不掉串口中断,想不明白,另在这样处理
TI=0;
      while(!TI);
      TI=0;
能减低进入串口中断程序概率。不知道大侠有什么高招?

jxcrg_t35 发表于 2014-10-3 09:35:27

补充:使用11.0592M,9600b/s

dsp56789 发表于 2014-10-3 09:35:57

神奇,禁止了中断也还会进入

xiaobendan 发表于 2014-10-3 10:35:15

没有回答我,怎么确定是进入了中断?

jxcrg_t35 发表于 2014-10-3 10:57:35

xiaobendan 发表于 2014-10-3 10:35
没有回答我,怎么确定是进入了中断?

是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。

ninghuchong 发表于 2014-10-3 15:28:11

jxcrg_t35 发表于 2014-10-3 10:57
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 ...

“串口中断程序发出的特定字节”?
把你的“串口中断程序”发出来看一下。

xiaobendan 发表于 2014-10-3 19:30:19

jxcrg_t35 发表于 2014-10-3 10:57
是的,因为在电脑侧串口接收程序,收到了串口中断程序发出的特定字节如0x10等,觉得匪夷所思。 ...

就是说你有写串口中断服务了?

jxcrg_t35 发表于 2014-10-3 20:19:10

xiaobendan 发表于 2014-10-3 19:30
就是说你有写串口中断服务了?

是的,所以才想不明白

xiaobendan 发表于 2014-10-4 08:21:57

明白,你的意思是中断服务吧TI清零了,所以WHILE在死等。
那么你确认中断是因为你在WHILE之前的发送指令造成的吗?
其实你说的那个延时的程序也可以用啊。你可以在定时器中设置一个timer,然后在WHILE里判断其值为真,退出循环就好。

jxcrg_t35 发表于 2014-10-4 08:47:06

xiaobendan 发表于 2014-10-4 08:21
明白,你的意思是中断服务吧TI清零了,所以WHILE在死等。
那么你确认中断是因为你在WHILE之前的发送指令造 ...

谢谢你回复,今天加了超时退出机制,确定是进入了中断,作用明显。不会死等啦。
目前在程序里开启了EXT0,1;TIME0,1;UART中断,他们之间互相干扰了??

jxcrg_t35 发表于 2014-10-4 09:03:24

今天这样加了超时判断,妈妈再也不用担心我的学习了。
        i=1000;
        for(;!TI&&(i>0);i--){_nop_();}
               TI=0;

liyang0727 发表于 2014-10-4 09:28:09

不需要串口中断,就不用中断程序啊,如果有接收中断就用if (RI){RI=0;}

jxcrg_t35 发表于 2014-10-4 09:57:39

liyang0727 发表于 2014-10-4 09:28
不需要串口中断,就不用中断程序啊,如果有接收中断就用if (RI){RI=0;}

都需要用的,还可以增加大程序中标志位,在中断程序内判断该标志位,如符合,则退出。

jxcrg_t35 发表于 2014-10-4 21:53:17

[结贴] 请教STC12C5A60S2串口问题-原因找到

未编写T1的中断程序导致。谢谢大家关注
页: [1]
查看完整版本: 请教STC12C5A60S2串口问题