STC单片机串口不可以连续接收数据

我用STC89C52,接收数据,但是用串口调试助手连续发送数据的时候,一次发送一个字节,但是单片机一次只能接收2次,?怎么会这样?
void MAIN_RS_INT(void) interrupt 4 using 3 //串口通讯中断函数{ uchar DataTemp; uchar i; if(RI) // 接收 { RI = 0; DataTemp = SBUF; /************************************/
switch (ReceState) { case 0: //开始 Send_data(temp3); break; case 1: Send_data(temp4); ReceState = 2; } break; case 2: Send_data(temp5); } ReceState = 3; break; case 3: Send_data(temp6); ReceState = 0; break; default: temp=0; ReceCount=0; ReceState=0; break; }
}

明显就不合理,你在中断里发送数据,估计你还是在那里等它发送完。
当你接收第一次中断的时候,你清除了中断,发送你的数据,此时单片机接收到了n次数据,但是还不能被立即中断,因为你在中断里发送数据,还没退出中断,但此时RI已经置1,发送数据结束后,退出当前中断,由于之前RI置1了(sbuf被刷新很多次,只能接收最近一个字节),又响应了一次中断,所以再发一次数据。
解决办法:在中断外发送数据,并采用循环队列接收方式。追问

你好,我是初次,使用STC,想问问你,这个循环队列接收,具体怎样啊?能给一个简单的例子吗?
谢谢

追答

我手上没有现成的程序,就是做一个数组,和一个当前存放数据索引号,每一次中断进来都先把数据接收放到索引号对应的数组位置中(索引号记得要变),main函数中判断数组有接收未处理的数据,就对接收内容处理。
这个跟STC单片机没关系

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-29
void MAIN_RS_INT(void) interrupt 4 using 3 //串口通讯中断函数
{
uchar DataTemp; uchar i;
if(TI)TI=0;
if(RI) // 接收
{ RI = 0;
DataTemp = SBUF; /************************************/ switch (ReceState)
{
case 0: //开始
Send_data(temp3);
break;
case 1:
Send_data(temp4);
ReceState = 2;
break;
case 2:
Send_data(temp5);
ReceState = 3;
break;
case 3:
Send_data(temp6);
ReceState = 0;
break;
default:
temp=0;
ReceCount=0;
ReceState=0;
break;
}}
第2个回答  2013-12-28
你发送的方式是什么?16进制方式和默认的发送方式是不同的,发送和接受的数据可能会是不同进制,你仔细看看是不是发送方式选错了追问

刚经过测试,应该是串口接收的中断函数占据了较长的时间,因为,我这里贴出来的是经过精简的,把处理函数精简后,能连续接收。想问问,串口中断处理函数如果要处理比较多的数据,就会终止下一次的接收吗?

追答

不会终止,但可能会接受不到或不全,串口中断函数可以在数据之间加nop()指令延时。这样便于数据接受处理

相似回答