51单片机串口无法连续发送

STC的单片机,需要连续通过串口发送数据,波特率2400,但是我的TI不能自动置位,当发送完第一个字节之后,程序就死在了while(!TI);这个地方,为什么会这样呀
是不是别的什么设置的不正确?
亟待解决,不胜感激

发送程序如下
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI); //程序在这里死循环了
TI = 0;
}
中断程序如下:
void UARTInterrupt(void) interrupt 4
{
if(RI)
{ RI = 0; /*中间是我自己的代码*/ }
else
TI = 0;
}

串口中断服务interrupt函数错了, else TI = 0;这两句删掉就对了。 当SBUF一旦发送数据完毕,就会TI=1,产生一次串口中断,这个时候中断发生优先级比进入你while(!TI);这句要高(快),即进入串口中断函数,走else这里直接把TI=0了,然后回到主函数永远卡在while(!TI);了,所以你就只能发送一个字节(一帧)成功,后面全部卡在while这句里死循环了。
这个类似“模板”的串口中断服务函数不知道谁先传开的,是错的,希望以后别用了,我指else TI = 0;这里。 串口中断只考虑IF(RI==1)这里的接收判断就行了,因为你发送TI这里的处理是用的查询while的方式,不是中断。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-24
发送程序如下
void SendOneByte(unsigned char c)
{
SBUF = c;
TI = 0;

while(!TI);
}
中断程序如下:
void UARTInterrupt(void) interrupt 4
{
if(RI)
{ RI = 0; /*中间是我自己的代码*/ }
else
TI = 0;
}
试一下看看、、是不是0错误0警告,不然就是自身程序有问题啦。耐心找哦。本回答被提问者采纳
第2个回答  2011-08-24
bit TI_ed; //加上一个变量

发送程序如下
void SendOneByte(unsigned char c)
{
TI_ed = 0;
SBUF = c;
while(!TI_ed); //等待发送完毕.
TI_ed = 0;
}

中断程序如下:
void UARTInterrupt(void) interrupt 4
{
if(RI) {
RI = 0;
/*中间是我自己的代码*/
}
else {
TI = 0;
TI_ed = 1;
}
}
第3个回答  2011-08-24
你的串口中断有问题,TI = 0;中断一到你就把发送关了,怎么还能发送。
第4个回答  2011-08-24
当然可以。中断发生后,表示接已经完成,可以发送了。不过如果外面使用485等半双工通讯的话,要考虑电路收发转换的延时时间,等电路稳定,再发送。
相似回答